codesift-mcp 0.14.0 → 0.15.0
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/README.md +5 -1
- package/dist/cli/commands-admin.d.ts +18 -0
- package/dist/cli/commands-admin.d.ts.map +1 -0
- package/dist/cli/commands-admin.js +187 -0
- package/dist/cli/commands-admin.js.map +1 -0
- package/dist/cli/commands-daemon.d.ts +42 -0
- package/dist/cli/commands-daemon.d.ts.map +1 -0
- package/dist/cli/commands-daemon.js +163 -0
- package/dist/cli/commands-daemon.js.map +1 -0
- package/dist/cli/commands-index.d.ts +12 -0
- package/dist/cli/commands-index.d.ts.map +1 -0
- package/dist/cli/commands-index.js +133 -0
- package/dist/cli/commands-index.js.map +1 -0
- package/dist/cli/commands-maintenance.d.ts +12 -0
- package/dist/cli/commands-maintenance.d.ts.map +1 -0
- package/dist/cli/commands-maintenance.js +409 -0
- package/dist/cli/commands-maintenance.js.map +1 -0
- package/dist/cli/commands-query.d.ts +21 -0
- package/dist/cli/commands-query.d.ts.map +1 -0
- package/dist/cli/commands-query.js +270 -0
- package/dist/cli/commands-query.js.map +1 -0
- package/dist/cli/commands.d.ts +2 -36
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +8 -867
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/embed-child.js +13 -2
- package/dist/cli/embed-child.js.map +1 -1
- package/dist/instructions.d.ts +1 -1
- package/dist/instructions.d.ts.map +1 -1
- package/dist/instructions.js +5 -2
- package/dist/instructions.js.map +1 -1
- package/dist/parser/extractors/php-class-metadata.d.ts +10 -0
- package/dist/parser/extractors/php-class-metadata.d.ts.map +1 -0
- package/dist/parser/extractors/php-class-metadata.js +65 -0
- package/dist/parser/extractors/php-class-metadata.js.map +1 -0
- package/dist/parser/extractors/php-doc.d.ts +13 -0
- package/dist/parser/extractors/php-doc.d.ts.map +1 -0
- package/dist/parser/extractors/php-doc.js +39 -0
- package/dist/parser/extractors/php-doc.js.map +1 -0
- package/dist/parser/extractors/php-node-metadata.d.ts +26 -0
- package/dist/parser/extractors/php-node-metadata.d.ts.map +1 -0
- package/dist/parser/extractors/php-node-metadata.js +132 -0
- package/dist/parser/extractors/php-node-metadata.js.map +1 -0
- package/dist/parser/extractors/php-symbol-builders.d.ts +13 -0
- package/dist/parser/extractors/php-symbol-builders.d.ts.map +1 -0
- package/dist/parser/extractors/php-symbol-builders.js +58 -0
- package/dist/parser/extractors/php-symbol-builders.js.map +1 -0
- package/dist/parser/extractors/php-walker.d.ts +4 -0
- package/dist/parser/extractors/php-walker.d.ts.map +1 -0
- package/dist/parser/extractors/php-walker.js +238 -0
- package/dist/parser/extractors/php-walker.js.map +1 -0
- package/dist/parser/extractors/php.d.ts +2 -33
- package/dist/parser/extractors/php.d.ts.map +1 -1
- package/dist/parser/extractors/php.js +2 -747
- package/dist/parser/extractors/php.js.map +1 -1
- package/dist/register-tool-loaders.d.ts +11 -11
- package/dist/register-tool-loaders.d.ts.map +1 -1
- package/dist/register-tools/runtime.d.ts +11 -0
- package/dist/register-tools/runtime.d.ts.map +1 -1
- package/dist/register-tools/runtime.js +40 -0
- package/dist/register-tools/runtime.js.map +1 -1
- package/dist/register-tools.d.ts.map +1 -1
- package/dist/register-tools.js +5 -1
- package/dist/register-tools.js.map +1 -1
- package/dist/retrieval/semantic-handlers.d.ts.map +1 -1
- package/dist/retrieval/semantic-handlers.js +10 -3
- package/dist/retrieval/semantic-handlers.js.map +1 -1
- package/dist/search/semantic.d.ts +2 -0
- package/dist/search/semantic.d.ts.map +1 -1
- package/dist/search/semantic.js +41 -9
- package/dist/search/semantic.js.map +1 -1
- package/dist/storage/chunk-store.d.ts +14 -2
- package/dist/storage/chunk-store.d.ts.map +1 -1
- package/dist/storage/chunk-store.js +214 -34
- package/dist/storage/chunk-store.js.map +1 -1
- package/dist/storage/embedding-store.d.ts +0 -12
- package/dist/storage/embedding-store.d.ts.map +1 -1
- package/dist/storage/embedding-store.js +69 -9
- package/dist/storage/embedding-store.js.map +1 -1
- package/dist/storage/index-cache.d.ts +12 -0
- package/dist/storage/index-cache.d.ts.map +1 -0
- package/dist/storage/index-cache.js +89 -0
- package/dist/storage/index-cache.js.map +1 -0
- package/dist/storage/index-json-mutations.d.ts +11 -0
- package/dist/storage/index-json-mutations.d.ts.map +1 -0
- package/dist/storage/index-json-mutations.js +93 -0
- package/dist/storage/index-json-mutations.js.map +1 -0
- package/dist/storage/index-migration.d.ts +22 -0
- package/dist/storage/index-migration.d.ts.map +1 -0
- package/dist/storage/index-migration.js +80 -0
- package/dist/storage/index-migration.js.map +1 -0
- package/dist/storage/index-store.d.ts +5 -61
- package/dist/storage/index-store.d.ts.map +1 -1
- package/dist/storage/index-store.js +33 -414
- package/dist/storage/index-store.js.map +1 -1
- package/dist/storage/index-version.d.ts +39 -0
- package/dist/storage/index-version.d.ts.map +1 -0
- package/dist/storage/index-version.js +87 -0
- package/dist/storage/index-version.js.map +1 -0
- package/dist/storage/registry.d.ts +9 -1
- package/dist/storage/registry.d.ts.map +1 -1
- package/dist/storage/registry.js +169 -8
- package/dist/storage/registry.js.map +1 -1
- package/dist/storage/shared-embedding-cache.d.ts +23 -3
- package/dist/storage/shared-embedding-cache.d.ts.map +1 -1
- package/dist/storage/shared-embedding-cache.js +300 -45
- package/dist/storage/shared-embedding-cache.js.map +1 -1
- package/dist/storage/telemetry/config.d.ts.map +1 -1
- package/dist/storage/telemetry/config.js +3 -2
- package/dist/storage/telemetry/config.js.map +1 -1
- package/dist/storage/telemetry/retro-aggregator.d.ts +21 -0
- package/dist/storage/telemetry/retro-aggregator.d.ts.map +1 -1
- package/dist/storage/telemetry/retro-aggregator.js +58 -16
- package/dist/storage/telemetry/retro-aggregator.js.map +1 -1
- package/dist/storage/telemetry/sanitizer.d.ts +16 -0
- package/dist/storage/telemetry/sanitizer.d.ts.map +1 -1
- package/dist/storage/telemetry/sanitizer.js +2 -0
- package/dist/storage/telemetry/sanitizer.js.map +1 -1
- package/dist/storage/telemetry/uploader.d.ts +3 -1
- package/dist/storage/telemetry/uploader.d.ts.map +1 -1
- package/dist/storage/telemetry/uploader.js +158 -21
- package/dist/storage/telemetry/uploader.js.map +1 -1
- package/dist/tools/cross-repo-contract-adapters.d.ts +39 -0
- package/dist/tools/cross-repo-contract-adapters.d.ts.map +1 -0
- package/dist/tools/cross-repo-contract-adapters.js +70 -0
- package/dist/tools/cross-repo-contract-adapters.js.map +1 -0
- package/dist/tools/cross-repo-contract-group.d.ts +17 -0
- package/dist/tools/cross-repo-contract-group.d.ts.map +1 -0
- package/dist/tools/cross-repo-contract-group.js +89 -0
- package/dist/tools/cross-repo-contract-group.js.map +1 -0
- package/dist/tools/cross-repo-contract-matcher.d.ts +24 -0
- package/dist/tools/cross-repo-contract-matcher.d.ts.map +1 -0
- package/dist/tools/cross-repo-contract-matcher.js +134 -0
- package/dist/tools/cross-repo-contract-matcher.js.map +1 -0
- package/dist/tools/cross-repo-contract-resolver.d.ts +9 -0
- package/dist/tools/cross-repo-contract-resolver.d.ts.map +1 -0
- package/dist/tools/cross-repo-contract-resolver.js +86 -0
- package/dist/tools/cross-repo-contract-resolver.js.map +1 -0
- package/dist/tools/cross-repo-contract-tools.d.ts +12 -135
- package/dist/tools/cross-repo-contract-tools.d.ts.map +1 -1
- package/dist/tools/cross-repo-contract-tools.js +8 -589
- package/dist/tools/cross-repo-contract-tools.js.map +1 -1
- package/dist/tools/cross-repo-contract-types.d.ts +30 -0
- package/dist/tools/cross-repo-contract-types.d.ts.map +1 -0
- package/dist/tools/cross-repo-contract-types.js +3 -0
- package/dist/tools/cross-repo-contract-types.js.map +1 -0
- package/dist/tools/cross-repo-outbound-calls.d.ts +28 -0
- package/dist/tools/cross-repo-outbound-calls.d.ts.map +1 -0
- package/dist/tools/cross-repo-outbound-calls.js +347 -0
- package/dist/tools/cross-repo-outbound-calls.js.map +1 -0
- package/dist/tools/cross-repo-outbound-lexer/call-detectors.d.ts.map +1 -1
- package/dist/tools/cross-repo-outbound-lexer/call-detectors.js +2 -0
- package/dist/tools/cross-repo-outbound-lexer/call-detectors.js.map +1 -1
- package/dist/tools/cross-repo-outbound-lexer/types.d.ts +2 -0
- package/dist/tools/cross-repo-outbound-lexer/types.d.ts.map +1 -1
- package/dist/tools/index-tools/file-indexer.js +3 -3
- package/dist/tools/index-tools/file-indexer.js.map +1 -1
- package/dist/tools/index-tools/folder-indexer.d.ts.map +1 -1
- package/dist/tools/index-tools/folder-indexer.js +47 -2
- package/dist/tools/index-tools/folder-indexer.js.map +1 -1
- package/dist/tools/index-tools/parse.d.ts +12 -3
- package/dist/tools/index-tools/parse.d.ts.map +1 -1
- package/dist/tools/index-tools/parse.js +33 -8
- package/dist/tools/index-tools/parse.js.map +1 -1
- package/dist/tools/index-tools/registry.d.ts +19 -0
- package/dist/tools/index-tools/registry.d.ts.map +1 -1
- package/dist/tools/index-tools/registry.js +88 -2
- package/dist/tools/index-tools/registry.js.map +1 -1
- package/dist/tools/index-tools/state.d.ts +31 -0
- package/dist/tools/index-tools/state.d.ts.map +1 -1
- package/dist/tools/index-tools/state.js +53 -0
- package/dist/tools/index-tools/state.js.map +1 -1
- package/dist/tools/index-tools/types.d.ts +9 -0
- package/dist/tools/index-tools/types.d.ts.map +1 -1
- package/dist/tools/index-tools/watcher.js +3 -3
- package/dist/tools/index-tools/watcher.js.map +1 -1
- package/dist/tools/index-tools/worktree-seed.d.ts +44 -0
- package/dist/tools/index-tools/worktree-seed.d.ts.map +1 -0
- package/dist/tools/index-tools/worktree-seed.js +302 -0
- package/dist/tools/index-tools/worktree-seed.js.map +1 -0
- package/dist/tools/index-tools.d.ts.map +1 -1
- package/dist/tools/index-tools.js +3 -1
- package/dist/tools/index-tools.js.map +1 -1
- package/dist/tools/nest-ext-tools/graphql.d.ts +17 -0
- package/dist/tools/nest-ext-tools/graphql.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/graphql.js +54 -0
- package/dist/tools/nest-ext-tools/graphql.js.map +1 -0
- package/dist/tools/nest-ext-tools/microservice.d.ts +17 -0
- package/dist/tools/nest-ext-tools/microservice.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/microservice.js +51 -0
- package/dist/tools/nest-ext-tools/microservice.js.map +1 -0
- package/dist/tools/nest-ext-tools/openapi.d.ts +81 -0
- package/dist/tools/nest-ext-tools/openapi.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/openapi.js +254 -0
- package/dist/tools/nest-ext-tools/openapi.js.map +1 -0
- package/dist/tools/nest-ext-tools/queue.d.ts +27 -0
- package/dist/tools/nest-ext-tools/queue.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/queue.js +95 -0
- package/dist/tools/nest-ext-tools/queue.js.map +1 -0
- package/dist/tools/nest-ext-tools/schedule.d.ts +19 -0
- package/dist/tools/nest-ext-tools/schedule.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/schedule.js +89 -0
- package/dist/tools/nest-ext-tools/schedule.js.map +1 -0
- package/dist/tools/nest-ext-tools/scope.d.ts +19 -0
- package/dist/tools/nest-ext-tools/scope.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/scope.js +151 -0
- package/dist/tools/nest-ext-tools/scope.js.map +1 -0
- package/dist/tools/nest-ext-tools/shared.d.ts +33 -0
- package/dist/tools/nest-ext-tools/shared.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/shared.js +279 -0
- package/dist/tools/nest-ext-tools/shared.js.map +1 -0
- package/dist/tools/nest-ext-tools/typeorm.d.ts +22 -0
- package/dist/tools/nest-ext-tools/typeorm.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/typeorm.js +59 -0
- package/dist/tools/nest-ext-tools/typeorm.js.map +1 -0
- package/dist/tools/nest-ext-tools/websocket.d.ts +21 -0
- package/dist/tools/nest-ext-tools/websocket.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools/websocket.js +70 -0
- package/dist/tools/nest-ext-tools/websocket.js.map +1 -0
- package/dist/tools/nest-ext-tools.d.ts +10 -204
- package/dist/tools/nest-ext-tools.d.ts.map +1 -1
- package/dist/tools/nest-ext-tools.js +10 -749
- package/dist/tools/nest-ext-tools.js.map +1 -1
- package/dist/tools/perf-tools.js +2 -2
- package/dist/tools/python-audit/checks/dead-code.d.ts +1 -1
- package/dist/tools/python-audit/checks/dead-code.d.ts.map +1 -1
- package/dist/tools/python-constants/constant-match.d.ts +5 -0
- package/dist/tools/python-constants/constant-match.d.ts.map +1 -0
- package/dist/tools/python-constants/constant-match.js +24 -0
- package/dist/tools/python-constants/constant-match.js.map +1 -0
- package/dist/tools/python-constants/file-context.d.ts +5 -0
- package/dist/tools/python-constants/file-context.d.ts.map +1 -0
- package/dist/tools/python-constants/file-context.js +91 -0
- package/dist/tools/python-constants/file-context.js.map +1 -0
- package/dist/tools/python-constants/function-defaults.d.ts +5 -0
- package/dist/tools/python-constants/function-defaults.d.ts.map +1 -0
- package/dist/tools/python-constants/function-defaults.js +98 -0
- package/dist/tools/python-constants/function-defaults.js.map +1 -0
- package/dist/tools/python-constants/model.d.ts +78 -0
- package/dist/tools/python-constants/model.d.ts.map +1 -0
- package/dist/tools/python-constants/model.js +2 -0
- package/dist/tools/python-constants/model.js.map +1 -0
- package/dist/tools/python-constants/syntax.d.ts +22 -0
- package/dist/tools/python-constants/syntax.d.ts.map +1 -0
- package/dist/tools/python-constants/syntax.js +93 -0
- package/dist/tools/python-constants/syntax.js.map +1 -0
- package/dist/tools/python-constants/value-resolver.d.ts +6 -0
- package/dist/tools/python-constants/value-resolver.d.ts.map +1 -0
- package/dist/tools/python-constants/value-resolver.js +320 -0
- package/dist/tools/python-constants/value-resolver.js.map +1 -0
- package/dist/tools/python-constants-tools.d.ts +3 -45
- package/dist/tools/python-constants-tools.d.ts.map +1 -1
- package/dist/tools/python-constants-tools.js +2 -505
- package/dist/tools/python-constants-tools.js.map +1 -1
- package/dist/tools/route-tools/django.d.ts +8 -0
- package/dist/tools/route-tools/django.d.ts.map +1 -0
- package/dist/tools/route-tools/django.js +52 -0
- package/dist/tools/route-tools/django.js.map +1 -0
- package/dist/tools/route-tools/express.d.ts +5 -0
- package/dist/tools/route-tools/express.d.ts.map +1 -0
- package/dist/tools/route-tools/express.js +33 -0
- package/dist/tools/route-tools/express.js.map +1 -0
- package/dist/tools/route-tools/file-sources.d.ts +7 -0
- package/dist/tools/route-tools/file-sources.d.ts.map +1 -0
- package/dist/tools/route-tools/file-sources.js +15 -0
- package/dist/tools/route-tools/file-sources.js.map +1 -0
- package/dist/tools/route-tools/handler-discovery.d.ts +4 -0
- package/dist/tools/route-tools/handler-discovery.d.ts.map +1 -0
- package/dist/tools/route-tools/handler-discovery.js +38 -0
- package/dist/tools/route-tools/handler-discovery.js.map +1 -0
- package/dist/tools/route-tools/hono.d.ts +5 -0
- package/dist/tools/route-tools/hono.d.ts.map +1 -0
- package/dist/tools/route-tools/hono.js +61 -0
- package/dist/tools/route-tools/hono.js.map +1 -0
- package/dist/tools/route-tools/ktor.d.ts +5 -0
- package/dist/tools/route-tools/ktor.d.ts.map +1 -0
- package/dist/tools/route-tools/ktor.js +76 -0
- package/dist/tools/route-tools/ktor.js.map +1 -0
- package/dist/tools/route-tools/laravel.d.ts +5 -0
- package/dist/tools/route-tools/laravel.d.ts.map +1 -0
- package/dist/tools/route-tools/laravel.js +45 -0
- package/dist/tools/route-tools/laravel.js.map +1 -0
- package/dist/tools/route-tools/mermaid-call-chain.d.ts +3 -0
- package/dist/tools/route-tools/mermaid-call-chain.d.ts.map +1 -0
- package/dist/tools/route-tools/mermaid-call-chain.js +50 -0
- package/dist/tools/route-tools/mermaid-call-chain.js.map +1 -0
- package/dist/tools/route-tools/nest.d.ts +5 -0
- package/dist/tools/route-tools/nest.d.ts.map +1 -0
- package/dist/tools/route-tools/nest.js +75 -0
- package/dist/tools/route-tools/nest.js.map +1 -0
- package/dist/tools/route-tools/next-trace.d.ts +4 -0
- package/dist/tools/route-tools/next-trace.d.ts.map +1 -0
- package/dist/tools/route-tools/next-trace.js +48 -0
- package/dist/tools/route-tools/next-trace.js.map +1 -0
- package/dist/tools/route-tools/next.d.ts +7 -0
- package/dist/tools/route-tools/next.d.ts.map +1 -0
- package/dist/tools/route-tools/next.js +77 -0
- package/dist/tools/route-tools/next.js.map +1 -0
- package/dist/tools/route-tools/python-decorators.d.ts +7 -0
- package/dist/tools/route-tools/python-decorators.d.ts.map +1 -0
- package/dist/tools/route-tools/python-decorators.js +53 -0
- package/dist/tools/route-tools/python-decorators.js.map +1 -0
- package/dist/tools/route-tools/route-mermaid.d.ts +4 -0
- package/dist/tools/route-tools/route-mermaid.d.ts.map +1 -0
- package/dist/tools/route-tools/route-mermaid.js +53 -0
- package/dist/tools/route-tools/route-mermaid.js.map +1 -0
- package/dist/tools/route-tools/spring-kotlin.d.ts +5 -0
- package/dist/tools/route-tools/spring-kotlin.d.ts.map +1 -0
- package/dist/tools/route-tools/spring-kotlin.js +52 -0
- package/dist/tools/route-tools/spring-kotlin.js.map +1 -0
- package/dist/tools/route-tools/trace-analysis.d.ts +4 -0
- package/dist/tools/route-tools/trace-analysis.d.ts.map +1 -0
- package/dist/tools/route-tools/trace-analysis.js +37 -0
- package/dist/tools/route-tools/trace-analysis.js.map +1 -0
- package/dist/tools/route-tools/trace-route.d.ts +6 -0
- package/dist/tools/route-tools/trace-route.d.ts.map +1 -0
- package/dist/tools/route-tools/trace-route.js +53 -0
- package/dist/tools/route-tools/trace-route.js.map +1 -0
- package/dist/tools/route-tools/types.d.ts +35 -0
- package/dist/tools/route-tools/types.d.ts.map +1 -0
- package/dist/tools/route-tools/types.js +2 -0
- package/dist/tools/route-tools/types.js.map +1 -0
- package/dist/tools/route-tools/yii2.d.ts +5 -0
- package/dist/tools/route-tools/yii2.d.ts.map +1 -0
- package/dist/tools/route-tools/yii2.js +73 -0
- package/dist/tools/route-tools/yii2.js.map +1 -0
- package/dist/tools/route-tools.d.ts +7 -49
- package/dist/tools/route-tools.d.ts.map +1 -1
- package/dist/tools/route-tools.js +5 -978
- package/dist/tools/route-tools.js.map +1 -1
- package/dist/tools/symbol-analysis-tools.d.ts +81 -0
- package/dist/tools/symbol-analysis-tools.d.ts.map +1 -0
- package/dist/tools/symbol-analysis-tools.js +327 -0
- package/dist/tools/symbol-analysis-tools.js.map +1 -0
- package/dist/tools/symbol-context-tools.d.ts +68 -0
- package/dist/tools/symbol-context-tools.d.ts.map +1 -0
- package/dist/tools/symbol-context-tools.js +232 -0
- package/dist/tools/symbol-context-tools.js.map +1 -0
- package/dist/tools/symbol-lookup-tools.d.ts +77 -0
- package/dist/tools/symbol-lookup-tools.d.ts.map +1 -0
- package/dist/tools/symbol-lookup-tools.js +305 -0
- package/dist/tools/symbol-lookup-tools.js.map +1 -0
- package/dist/tools/symbol-reference-tools.d.ts +38 -0
- package/dist/tools/symbol-reference-tools.d.ts.map +1 -0
- package/dist/tools/symbol-reference-tools.js +253 -0
- package/dist/tools/symbol-reference-tools.js.map +1 -0
- package/dist/tools/symbol-tool-internals.d.ts +9 -0
- package/dist/tools/symbol-tool-internals.d.ts.map +1 -0
- package/dist/tools/symbol-tool-internals.js +47 -0
- package/dist/tools/symbol-tool-internals.js.map +1 -0
- package/dist/tools/symbol-tools.d.ts +11 -270
- package/dist/tools/symbol-tools.d.ts.map +1 -1
- package/dist/tools/symbol-tools.js +7 -1131
- package/dist/tools/symbol-tools.js.map +1 -1
- package/dist/tools/taint/python-context.d.ts +10 -0
- package/dist/tools/taint/python-context.d.ts.map +1 -0
- package/dist/tools/taint/python-context.js +150 -0
- package/dist/tools/taint/python-context.js.map +1 -0
- package/dist/tools/taint/taint-analyzer.d.ts +2 -0
- package/dist/tools/taint/taint-analyzer.d.ts.map +1 -0
- package/dist/tools/taint/taint-analyzer.js +2 -0
- package/dist/tools/taint/taint-analyzer.js.map +1 -0
- package/dist/tools/taint/taint-expression.d.ts +18 -0
- package/dist/tools/taint/taint-expression.d.ts.map +1 -0
- package/dist/tools/taint/taint-expression.js +265 -0
- package/dist/tools/taint/taint-expression.js.map +1 -0
- package/dist/tools/taint/taint-flow.d.ts +10 -0
- package/dist/tools/taint/taint-flow.d.ts.map +1 -0
- package/dist/tools/taint/taint-flow.js +178 -0
- package/dist/tools/taint/taint-flow.js.map +1 -0
- package/dist/tools/taint/taint-model.d.ts +113 -0
- package/dist/tools/taint/taint-model.d.ts.map +1 -0
- package/dist/tools/taint/taint-model.js +277 -0
- package/dist/tools/taint/taint-model.js.map +1 -0
- package/dist/tools/taint-tools.d.ts +2 -34
- package/dist/tools/taint-tools.d.ts.map +1 -1
- package/dist/tools/taint-tools.js +2 -852
- package/dist/tools/taint-tools.js.map +1 -1
- package/dist/tools/typescript-constants/file-context.d.ts +7 -0
- package/dist/tools/typescript-constants/file-context.d.ts.map +1 -0
- package/dist/tools/typescript-constants/file-context.js +219 -0
- package/dist/tools/typescript-constants/file-context.js.map +1 -0
- package/dist/tools/typescript-constants/symbol-resolver.d.ts +7 -0
- package/dist/tools/typescript-constants/symbol-resolver.d.ts.map +1 -0
- package/dist/tools/typescript-constants/symbol-resolver.js +165 -0
- package/dist/tools/typescript-constants/symbol-resolver.js.map +1 -0
- package/dist/tools/typescript-constants/types.d.ts +44 -0
- package/dist/tools/typescript-constants/types.d.ts.map +1 -0
- package/dist/tools/typescript-constants/types.js +2 -0
- package/dist/tools/typescript-constants/types.js.map +1 -0
- package/dist/tools/typescript-constants/value-evaluator.d.ts +8 -0
- package/dist/tools/typescript-constants/value-evaluator.d.ts.map +1 -0
- package/dist/tools/typescript-constants/value-evaluator.js +404 -0
- package/dist/tools/typescript-constants/value-evaluator.js.map +1 -0
- package/dist/tools/typescript-constants-tools.d.ts.map +1 -1
- package/dist/tools/typescript-constants-tools.js +19 -709
- package/dist/tools/typescript-constants-tools.js.map +1 -1
- package/dist/utils/import-graph/collect.d.ts +5 -0
- package/dist/utils/import-graph/collect.d.ts.map +1 -0
- package/dist/utils/import-graph/collect.js +47 -0
- package/dist/utils/import-graph/collect.js.map +1 -0
- package/dist/utils/import-graph/edge-accumulator.d.ts +7 -0
- package/dist/utils/import-graph/edge-accumulator.d.ts.map +1 -0
- package/dist/utils/import-graph/edge-accumulator.js +47 -0
- package/dist/utils/import-graph/edge-accumulator.js.map +1 -0
- package/dist/utils/import-graph/language-imports.d.ts +6 -0
- package/dist/utils/import-graph/language-imports.d.ts.map +1 -0
- package/dist/utils/import-graph/language-imports.js +84 -0
- package/dist/utils/import-graph/language-imports.js.map +1 -0
- package/dist/utils/import-graph/metrics.d.ts +6 -0
- package/dist/utils/import-graph/metrics.d.ts.map +1 -0
- package/dist/utils/import-graph/metrics.js +51 -0
- package/dist/utils/import-graph/metrics.js.map +1 -0
- package/dist/utils/import-graph/path-map.d.ts +7 -0
- package/dist/utils/import-graph/path-map.d.ts.map +1 -0
- package/dist/utils/import-graph/path-map.js +56 -0
- package/dist/utils/import-graph/path-map.js.map +1 -0
- package/dist/utils/import-graph/python-php-edge-collectors.d.ts +5 -0
- package/dist/utils/import-graph/python-php-edge-collectors.d.ts.map +1 -0
- package/dist/utils/import-graph/python-php-edge-collectors.js +56 -0
- package/dist/utils/import-graph/python-php-edge-collectors.js.map +1 -0
- package/dist/utils/import-graph/source-edge-collector.d.ts +13 -0
- package/dist/utils/import-graph/source-edge-collector.d.ts.map +1 -0
- package/dist/utils/import-graph/source-edge-collector.js +42 -0
- package/dist/utils/import-graph/source-edge-collector.js.map +1 -0
- package/dist/utils/import-graph/source-imports.d.ts +5 -0
- package/dist/utils/import-graph/source-imports.d.ts.map +1 -0
- package/dist/utils/import-graph/source-imports.js +33 -0
- package/dist/utils/import-graph/source-imports.js.map +1 -0
- package/dist/utils/import-graph/types.d.ts +15 -0
- package/dist/utils/import-graph/types.d.ts.map +1 -0
- package/dist/utils/import-graph/types.js +2 -0
- package/dist/utils/import-graph/types.js.map +1 -0
- package/dist/utils/import-graph/typescript-edge-collector.d.ts +7 -0
- package/dist/utils/import-graph/typescript-edge-collector.d.ts.map +1 -0
- package/dist/utils/import-graph/typescript-edge-collector.js +58 -0
- package/dist/utils/import-graph/typescript-edge-collector.js.map +1 -0
- package/dist/utils/import-graph/workspace-alias.d.ts +7 -0
- package/dist/utils/import-graph/workspace-alias.d.ts.map +1 -0
- package/dist/utils/import-graph/workspace-alias.js +95 -0
- package/dist/utils/import-graph/workspace-alias.js.map +1 -0
- package/dist/utils/import-graph/workspace-entry.d.ts +3 -0
- package/dist/utils/import-graph/workspace-entry.d.ts.map +1 -0
- package/dist/utils/import-graph/workspace-entry.js +81 -0
- package/dist/utils/import-graph/workspace-entry.js.map +1 -0
- package/dist/utils/import-graph.d.ts +10 -94
- package/dist/utils/import-graph.d.ts.map +1 -1
- package/dist/utils/import-graph.js +6 -702
- package/dist/utils/import-graph.js.map +1 -1
- package/package.json +1 -1
- package/rules/codesift.md +11 -2
- package/rules/codesift.mdc +11 -2
- package/rules/codex.md +11 -2
- package/rules/gemini.md +11 -2
|
@@ -1,703 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import { getParser } from "../parser/parser-manager.js";
|
|
8
|
-
import { getCachedParse, setCachedParse } from "../parser/parse-cache.js";
|
|
9
|
-
import { extractPythonImports } from "./python-imports.js";
|
|
10
|
-
import { resolvePythonImport, detectSrcLayout } from "./python-import-resolver.js";
|
|
11
|
-
import { resolvePhpNamespace } from "../tools/php-tools.js";
|
|
12
|
-
import { extractTypeScriptImports } from "./ts-imports.js";
|
|
13
|
-
import { resolveTsAliasedImport } from "./tsconfig-paths.js";
|
|
14
|
-
import { DirectedGraph } from "graphology";
|
|
15
|
-
import { createRequire } from "node:module";
|
|
16
|
-
// graphology-metrics has no "exports" field; use createRequire so the deep
|
|
17
|
-
// path resolves at runtime under both ESM and CJS consumers.
|
|
18
|
-
const req = createRequire(import.meta.url);
|
|
19
|
-
const pagerank = req("graphology-metrics/centrality/pagerank");
|
|
20
|
-
// Patterns for detecting import statements across common languages
|
|
21
|
-
const IMPORT_PATTERNS = [
|
|
22
|
-
// ES modules: import ... from '...' or import ... from "..."
|
|
23
|
-
/import\s+.*?\s+from\s+['"]([^'"]+)['"]/g,
|
|
24
|
-
// Dynamic import: import('...')
|
|
25
|
-
/import\s*\(\s*['"]([^'"]+)['"]\s*\)/g,
|
|
26
|
-
// CommonJS: require('...')
|
|
27
|
-
/require\s*\(\s*['"]([^'"]+)['"]\s*\)/g,
|
|
28
|
-
// PHP: require/include with relative path string: require __DIR__ . '/helpers.php';
|
|
29
|
-
/(?:require|include)(?:_once)?\s*\(?\s*(?:__DIR__\s*\.\s*)?['"](\.\.?\/[^'"]+\.php)['"]/g,
|
|
30
|
-
];
|
|
31
|
-
// Patterns for extracting PHP `use` statements (FQCN imports — PSR-4 based).
|
|
32
|
-
// These are NOT file paths; they need PSR-4 resolution via composer.json.
|
|
33
|
-
// Exposed separately so the resolver tool can opt-in.
|
|
34
|
-
//
|
|
35
|
-
// Accepts both UpperCase (PSR-1/2 modern) and lowercase (common in older
|
|
36
|
-
// Yii2 apps: `use app\models\Survey`) namespaces. The FQCN must contain at
|
|
37
|
-
// least one backslash to exclude global class imports like `use Closure;`
|
|
38
|
-
// and `use Yii;` which would be noise for the import graph.
|
|
39
|
-
//
|
|
40
|
-
// Two separate patterns:
|
|
41
|
-
// SINGLE — `use App\Models\User;` or `use App\Models\User as U;`
|
|
42
|
-
// GROUP — `use App\Models\{User, Post, Comment};` or with aliases
|
|
43
|
-
const PHP_USE_SINGLE_PATTERN = /^\s*use\s+(\w+(?:\\\w+)+)(?:\s+as\s+\w+)?\s*;/gm;
|
|
44
|
-
const PHP_USE_GROUP_PATTERN = /^\s*use\s+(\w+(?:\\\w+)*)\\\{([^}]+)\}\s*;/gm;
|
|
45
|
-
// Patterns for extracting Kotlin `import` statements (fully-qualified names).
|
|
46
|
-
// These are NOT file paths; they need heuristic resolution against source roots.
|
|
47
|
-
// Matches: `import com.example.UserService`, `import com.example.*`, `import com.example.Foo as Bar`
|
|
48
|
-
const KOTLIN_IMPORT_PATTERN = /^\s*import\s+([\w.]+(?:\.\*)?)(?:\s+as\s+\w+)?\s*$/gm;
|
|
49
|
-
/**
|
|
50
|
-
* Extract import paths from a source string.
|
|
51
|
-
* Returns relative paths only (skips node_modules / bare specifiers).
|
|
52
|
-
*/
|
|
53
|
-
export function extractImports(source) {
|
|
54
|
-
const imports = new Set();
|
|
55
|
-
for (const pattern of IMPORT_PATTERNS) {
|
|
56
|
-
pattern.lastIndex = 0;
|
|
57
|
-
let match;
|
|
58
|
-
while ((match = pattern.exec(source)) !== null) {
|
|
59
|
-
const importPath = match[1];
|
|
60
|
-
if (importPath && importPath.startsWith(".")) {
|
|
61
|
-
imports.add(importPath);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return [...imports];
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Extract bare-specifier imports (e.g. `@org/shared`, `@/utils`).
|
|
69
|
-
* Only used by the workspace-alias / tsconfig-paths resolvers when
|
|
70
|
-
* `index.workspaces` is present. Skips relative paths and skips imports
|
|
71
|
-
* that look like absolute file URLs.
|
|
72
|
-
*
|
|
73
|
-
* Task 6 of monorepo workspace intelligence plan.
|
|
74
|
-
*/
|
|
75
|
-
export function extractBareImports(source) {
|
|
76
|
-
const imports = new Set();
|
|
77
|
-
for (const pattern of IMPORT_PATTERNS) {
|
|
78
|
-
pattern.lastIndex = 0;
|
|
79
|
-
let match;
|
|
80
|
-
while ((match = pattern.exec(source)) !== null) {
|
|
81
|
-
const importPath = match[1];
|
|
82
|
-
if (!importPath)
|
|
83
|
-
continue;
|
|
84
|
-
if (importPath.startsWith(".") || importPath.startsWith("/"))
|
|
85
|
-
continue;
|
|
86
|
-
// Strip dynamic-import wrappers — we already handled them via pattern groups
|
|
87
|
-
imports.add(importPath);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
return [...imports];
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Normalize an import path relative to the importing file.
|
|
94
|
-
* Resolves "./foo" and "../bar" relative to the importer's directory.
|
|
95
|
-
*/
|
|
96
|
-
export function resolveImportPath(importerFile, importPath) {
|
|
97
|
-
const importerDir = importerFile.includes("/")
|
|
98
|
-
? importerFile.slice(0, importerFile.lastIndexOf("/"))
|
|
99
|
-
: ".";
|
|
100
|
-
const parts = importerDir.split("/");
|
|
101
|
-
for (const segment of importPath.split("/")) {
|
|
102
|
-
if (segment === ".")
|
|
103
|
-
continue;
|
|
104
|
-
if (segment === "..") {
|
|
105
|
-
parts.pop();
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
parts.push(segment);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
let resolved = parts.join("/");
|
|
112
|
-
resolved = resolved.replace(/\.(astro|ts|tsx|js|jsx|mjs|cjs|php)$/, "");
|
|
113
|
-
return resolved;
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Extract PHP `use` statements (FQCN imports).
|
|
117
|
-
* Returns fully-qualified class/namespace names without the leading backslash.
|
|
118
|
-
* These are NOT file paths — they require PSR-4 resolution against composer.json.
|
|
119
|
-
*
|
|
120
|
-
* Handles both single-FQCN and grouped forms:
|
|
121
|
-
* `use App\Models\User;`
|
|
122
|
-
* `use App\Models\User as U;`
|
|
123
|
-
* `use App\Models\{User, Post, Comment};`
|
|
124
|
-
* `use App\{Models\User, Services\Auth as A};`
|
|
125
|
-
*/
|
|
126
|
-
export function extractPhpUseStatements(source) {
|
|
127
|
-
const uses = new Set();
|
|
128
|
-
// Single FQCN form
|
|
129
|
-
PHP_USE_SINGLE_PATTERN.lastIndex = 0;
|
|
130
|
-
let match;
|
|
131
|
-
while ((match = PHP_USE_SINGLE_PATTERN.exec(source)) !== null) {
|
|
132
|
-
const fqcn = match[1]?.replace(/^\\/, "");
|
|
133
|
-
if (fqcn)
|
|
134
|
-
uses.add(fqcn);
|
|
135
|
-
}
|
|
136
|
-
// Grouped form — split the brace content on commas, strip aliases,
|
|
137
|
-
// concatenate each fragment with the prefix.
|
|
138
|
-
PHP_USE_GROUP_PATTERN.lastIndex = 0;
|
|
139
|
-
while ((match = PHP_USE_GROUP_PATTERN.exec(source)) !== null) {
|
|
140
|
-
const prefix = match[1]?.replace(/^\\/, "");
|
|
141
|
-
const members = match[2];
|
|
142
|
-
if (!prefix || !members)
|
|
143
|
-
continue;
|
|
144
|
-
for (const raw of members.split(",")) {
|
|
145
|
-
// Strip `as Alias` and surrounding whitespace
|
|
146
|
-
const bare = raw.replace(/\s+as\s+\w+\s*$/, "").trim();
|
|
147
|
-
if (bare)
|
|
148
|
-
uses.add(`${prefix}\\${bare}`);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
return [...uses];
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Extract Kotlin `import` statements (fully-qualified names).
|
|
155
|
-
* Returns dot-separated package + class names. Wildcards (`com.example.*`) are
|
|
156
|
-
* preserved as-is. These are NOT file paths — they require heuristic resolution
|
|
157
|
-
* against the source root (usually `src/main/kotlin`, `src/commonMain/kotlin`, etc.).
|
|
158
|
-
*/
|
|
159
|
-
export function extractKotlinImports(source) {
|
|
160
|
-
const imports = new Set();
|
|
161
|
-
KOTLIN_IMPORT_PATTERN.lastIndex = 0;
|
|
162
|
-
let match;
|
|
163
|
-
while ((match = KOTLIN_IMPORT_PATTERN.exec(source)) !== null) {
|
|
164
|
-
const fqName = match[1];
|
|
165
|
-
if (fqName)
|
|
166
|
-
imports.add(fqName);
|
|
167
|
-
}
|
|
168
|
-
return [...imports];
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* Heuristically resolve a Kotlin fully-qualified import to an indexed file.
|
|
172
|
-
* Strategy: match the last segment of the FQN (the simple class name) against
|
|
173
|
-
* file basenames. For `com.example.service.UserService`, tries to find a file
|
|
174
|
-
* whose basename (without .kt/.kts) is `UserService` AND whose path contains
|
|
175
|
-
* the package path `com/example/service`.
|
|
176
|
-
*
|
|
177
|
-
* Returns the matched file path or null if no match.
|
|
178
|
-
*
|
|
179
|
-
* Limitations: single-repo heuristic. Doesn't handle wildcard imports
|
|
180
|
-
* (`com.example.*`) or multi-module setups with complex source roots.
|
|
181
|
-
*/
|
|
182
|
-
export function resolveKotlinImport(fqName, kotlinFilesByBasename) {
|
|
183
|
-
// Skip wildcard imports — can't resolve to a single file
|
|
184
|
-
if (fqName.endsWith(".*"))
|
|
185
|
-
return null;
|
|
186
|
-
// Skip standard library / third-party (no way to index jar files)
|
|
187
|
-
if (fqName.startsWith("kotlin.") || fqName.startsWith("java.") ||
|
|
188
|
-
fqName.startsWith("javax.") || fqName.startsWith("android.") ||
|
|
189
|
-
fqName.startsWith("androidx.") || fqName.startsWith("org.jetbrains.") ||
|
|
190
|
-
fqName.startsWith("org.junit.")) {
|
|
191
|
-
return null;
|
|
192
|
-
}
|
|
193
|
-
const parts = fqName.split(".");
|
|
194
|
-
if (parts.length < 2)
|
|
195
|
-
return null;
|
|
196
|
-
const simpleName = parts[parts.length - 1];
|
|
197
|
-
const packagePath = parts.slice(0, -1).join("/");
|
|
198
|
-
const candidates = kotlinFilesByBasename.get(simpleName);
|
|
199
|
-
if (!candidates)
|
|
200
|
-
return null;
|
|
201
|
-
// Prefer candidate whose path contains the package path
|
|
202
|
-
for (const candidate of candidates) {
|
|
203
|
-
if (candidate.includes(packagePath))
|
|
204
|
-
return candidate;
|
|
205
|
-
}
|
|
206
|
-
// Fallback: if only one candidate, return it (common in small projects)
|
|
207
|
-
if (candidates.length === 1)
|
|
208
|
-
return candidates[0] ?? null;
|
|
209
|
-
return null;
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* Build a lookup map from Kotlin file basenames (without extension) to file paths.
|
|
213
|
-
* Used by resolveKotlinImport for heuristic FQN resolution.
|
|
214
|
-
*/
|
|
215
|
-
export function buildKotlinFilesByBasename(index) {
|
|
216
|
-
const map = new Map();
|
|
217
|
-
for (const file of index.files) {
|
|
218
|
-
if (!/\.kts?$/.test(file.path))
|
|
219
|
-
continue;
|
|
220
|
-
const basename = file.path
|
|
221
|
-
.slice(file.path.lastIndexOf("/") + 1)
|
|
222
|
-
.replace(/\.kts?$/, "");
|
|
223
|
-
const existing = map.get(basename);
|
|
224
|
-
if (existing) {
|
|
225
|
-
existing.push(file.path);
|
|
226
|
-
}
|
|
227
|
-
else {
|
|
228
|
-
map.set(basename, [file.path]);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
return map;
|
|
232
|
-
}
|
|
233
|
-
const NULL_RESOLVER = { resolve: () => null };
|
|
234
|
-
/** Build a workspace-alias resolver for the given index. Reads each
|
|
235
|
-
* workspace's package.json once at construction time to discover entry
|
|
236
|
-
* points; never reads disk afterwards. Returns a no-op resolver on flat
|
|
237
|
-
* repos. */
|
|
238
|
-
export function buildWorkspaceAliasResolver(index) {
|
|
239
|
-
const workspaces = index.workspaces;
|
|
240
|
-
if (!workspaces || workspaces.length === 0)
|
|
241
|
-
return NULL_RESOLVER;
|
|
242
|
-
const fileSet = new Set(index.files.map((f) => f.path));
|
|
243
|
-
const normalizedPaths = buildNormalizedPathMap(index);
|
|
244
|
-
// Workspace name → relative root (relative to index.root)
|
|
245
|
-
const wsRelByName = new Map();
|
|
246
|
-
// Workspace name → resolved entry file path (relative to index.root)
|
|
247
|
-
const wsEntryByName = new Map();
|
|
248
|
-
// Sorted list of (relativeRoot, workspace) for longest-prefix file lookup
|
|
249
|
-
const wsByPath = [];
|
|
250
|
-
for (const ws of workspaces) {
|
|
251
|
-
const rel = relRoot(ws.root, index.root);
|
|
252
|
-
if (rel === null)
|
|
253
|
-
continue;
|
|
254
|
-
wsByPath.push({ rel, ws });
|
|
255
|
-
if (ws.name) {
|
|
256
|
-
wsRelByName.set(ws.name, rel);
|
|
257
|
-
wsEntryByName.set(ws.name, resolveWorkspaceEntry(ws.root, rel, fileSet, normalizedPaths));
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
// Longest prefix first
|
|
261
|
-
wsByPath.sort((a, b) => b.rel.length - a.rel.length);
|
|
262
|
-
function findOriginatingWorkspace(importerFile) {
|
|
263
|
-
for (const { rel, ws } of wsByPath) {
|
|
264
|
-
if (rel === "" || importerFile === rel || importerFile.startsWith(rel + "/")) {
|
|
265
|
-
return ws;
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
return null;
|
|
269
|
-
}
|
|
270
|
-
function lookupFile(candidate) {
|
|
271
|
-
if (fileSet.has(candidate))
|
|
272
|
-
return candidate;
|
|
273
|
-
const stripped = candidate.replace(/\.(astro|ts|tsx|js|jsx|mjs|cjs)$/, "");
|
|
274
|
-
const normalized = normalizedPaths.get(stripped);
|
|
275
|
-
if (normalized)
|
|
276
|
-
return normalized;
|
|
277
|
-
// Try common entry-file suffixes
|
|
278
|
-
for (const suffix of ["/index.ts", "/index.tsx", "/index.js", "/index.jsx"]) {
|
|
279
|
-
const tryPath = candidate + suffix;
|
|
280
|
-
if (fileSet.has(tryPath))
|
|
281
|
-
return tryPath;
|
|
282
|
-
}
|
|
283
|
-
return null;
|
|
284
|
-
}
|
|
285
|
-
function resolveByWorkspaceName(importPath) {
|
|
286
|
-
// Exact workspace-name match → entry file
|
|
287
|
-
const directEntry = wsEntryByName.get(importPath);
|
|
288
|
-
if (directEntry)
|
|
289
|
-
return directEntry;
|
|
290
|
-
// Subpath import: `@org/shared/Button` → workspace `@org/shared` + subpath `Button`
|
|
291
|
-
for (const [wsName, wsRel] of wsRelByName) {
|
|
292
|
-
if (!importPath.startsWith(wsName + "/"))
|
|
293
|
-
continue;
|
|
294
|
-
const subpath = importPath.slice(wsName.length + 1);
|
|
295
|
-
// Try `<wsRel>/<subpath>`, then `<wsRel>/src/<subpath>`
|
|
296
|
-
for (const candidate of [`${wsRel}/${subpath}`, `${wsRel}/src/${subpath}`]) {
|
|
297
|
-
const found = lookupFile(candidate);
|
|
298
|
-
if (found)
|
|
299
|
-
return found;
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
return null;
|
|
303
|
-
}
|
|
304
|
-
function resolveByTsconfigPaths(importPath, importerFile) {
|
|
305
|
-
const ws = findOriginatingWorkspace(importerFile);
|
|
306
|
-
if (!ws)
|
|
307
|
-
return null;
|
|
308
|
-
for (const tsp of ws.tsconfig_paths) {
|
|
309
|
-
const pattern = tsp.from_pattern;
|
|
310
|
-
if (pattern.endsWith("/*")) {
|
|
311
|
-
const prefix = pattern.slice(0, -1); // "@org/" from "@org/*"
|
|
312
|
-
if (!importPath.startsWith(prefix))
|
|
313
|
-
continue;
|
|
314
|
-
const captured = importPath.slice(prefix.length);
|
|
315
|
-
for (const target of tsp.to_paths) {
|
|
316
|
-
const expanded = target.replace("*", captured);
|
|
317
|
-
// Try as repo-relative; also try relative to the originating workspace
|
|
318
|
-
const wsRel = relRoot(ws.root, index.root) ?? "";
|
|
319
|
-
const candidates = [expanded];
|
|
320
|
-
if (wsRel)
|
|
321
|
-
candidates.push(`${wsRel}/${expanded}`);
|
|
322
|
-
for (const c of candidates) {
|
|
323
|
-
const found = lookupFile(c);
|
|
324
|
-
if (found)
|
|
325
|
-
return found;
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
else if (pattern === importPath) {
|
|
330
|
-
for (const target of tsp.to_paths) {
|
|
331
|
-
const wsRel = relRoot(ws.root, index.root) ?? "";
|
|
332
|
-
const candidates = [target, wsRel ? `${wsRel}/${target}` : target];
|
|
333
|
-
for (const c of candidates) {
|
|
334
|
-
const found = lookupFile(c);
|
|
335
|
-
if (found)
|
|
336
|
-
return found;
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
return null;
|
|
342
|
-
}
|
|
343
|
-
return {
|
|
344
|
-
resolve: (importPath, importerFile) => {
|
|
345
|
-
// Workspace-name match takes precedence over tsconfig paths
|
|
346
|
-
const byName = resolveByWorkspaceName(importPath);
|
|
347
|
-
if (byName)
|
|
348
|
-
return byName;
|
|
349
|
-
return resolveByTsconfigPaths(importPath, importerFile);
|
|
350
|
-
},
|
|
351
|
-
};
|
|
352
|
-
}
|
|
353
|
-
function relRoot(absPath, indexRoot) {
|
|
354
|
-
if (!absPath.startsWith(indexRoot))
|
|
355
|
-
return null;
|
|
356
|
-
const rel = absPath.slice(indexRoot.length).replace(/^[\\/]+/, "");
|
|
357
|
-
return rel;
|
|
358
|
-
}
|
|
359
|
-
function resolveWorkspaceEntry(wsAbsRoot, wsRel, fileSet, normalizedPaths) {
|
|
360
|
-
const pkg = readWorkspacePackageJson(wsAbsRoot);
|
|
361
|
-
const entryRel = pickEntry(pkg);
|
|
362
|
-
const candidates = [];
|
|
363
|
-
if (entryRel) {
|
|
364
|
-
const cleaned = entryRel.replace(/^\.?\/+/, "");
|
|
365
|
-
candidates.push(wsRel ? `${wsRel}/${cleaned}` : cleaned);
|
|
366
|
-
}
|
|
367
|
-
// Common defaults (in order)
|
|
368
|
-
for (const def of ["src/index.ts", "src/index.tsx", "src/index.js", "index.ts", "index.tsx", "index.js"]) {
|
|
369
|
-
candidates.push(wsRel ? `${wsRel}/${def}` : def);
|
|
370
|
-
}
|
|
371
|
-
for (const c of candidates) {
|
|
372
|
-
if (fileSet.has(c))
|
|
373
|
-
return c;
|
|
374
|
-
const stripped = c.replace(/\.(astro|ts|tsx|js|jsx|mjs|cjs)$/, "");
|
|
375
|
-
const normalized = normalizedPaths.get(stripped);
|
|
376
|
-
if (normalized)
|
|
377
|
-
return normalized;
|
|
378
|
-
}
|
|
379
|
-
return null;
|
|
380
|
-
}
|
|
381
|
-
function readWorkspacePackageJson(absRoot) {
|
|
382
|
-
try {
|
|
383
|
-
return JSON.parse(readFileSync(`${absRoot}/package.json`, "utf-8"));
|
|
384
|
-
}
|
|
385
|
-
catch {
|
|
386
|
-
return null;
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
function pickEntry(pkg) {
|
|
390
|
-
if (!pkg)
|
|
391
|
-
return null;
|
|
392
|
-
// Prefer source > module > main; ignore complex exports
|
|
393
|
-
if (typeof pkg.source === "string")
|
|
394
|
-
return pkg.source;
|
|
395
|
-
if (typeof pkg.module === "string")
|
|
396
|
-
return pkg.module;
|
|
397
|
-
if (typeof pkg.main === "string")
|
|
398
|
-
return pkg.main;
|
|
399
|
-
if (pkg.exports && typeof pkg.exports === "object") {
|
|
400
|
-
const exp = pkg.exports;
|
|
401
|
-
const root = exp["."];
|
|
402
|
-
if (typeof root === "string")
|
|
403
|
-
return root;
|
|
404
|
-
if (root && typeof root === "object") {
|
|
405
|
-
const r = root;
|
|
406
|
-
for (const key of ["import", "default", "require"]) {
|
|
407
|
-
const v = r[key];
|
|
408
|
-
if (typeof v === "string")
|
|
409
|
-
return v;
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
return null;
|
|
414
|
-
}
|
|
415
|
-
/**
|
|
416
|
-
* Build normalized path map for matching imports to indexed files.
|
|
417
|
-
*/
|
|
418
|
-
export function buildNormalizedPathMap(index) {
|
|
419
|
-
const normalizedPaths = new Map();
|
|
420
|
-
for (const file of index.files) {
|
|
421
|
-
const normalized = file.path.replace(/\.(astro|ts|tsx|js|jsx|mjs|cjs|php|kt|kts|py)$/, "");
|
|
422
|
-
normalizedPaths.set(normalized, file.path);
|
|
423
|
-
if (normalized.endsWith("/index")) {
|
|
424
|
-
normalizedPaths.set(normalized.slice(0, -6), file.path);
|
|
425
|
-
}
|
|
426
|
-
// Python package index: map `foo/__init__` → `foo`
|
|
427
|
-
if (normalized.endsWith("/__init__")) {
|
|
428
|
-
normalizedPaths.set(normalized.slice(0, -9), file.path);
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
return normalizedPaths;
|
|
432
|
-
}
|
|
433
|
-
/**
|
|
434
|
-
* Collect all import edges between files in the index.
|
|
435
|
-
* Reads file source from disk to extract import statements.
|
|
436
|
-
* Handles JS/TS/PHP relative imports AND Kotlin fully-qualified imports
|
|
437
|
-
* (via heuristic basename + package-path matching).
|
|
438
|
-
*/
|
|
439
|
-
export async function collectImportEdges(index, fileFilter) {
|
|
440
|
-
const normalizedPaths = buildNormalizedPathMap(index);
|
|
441
|
-
const kotlinFilesByBasename = buildKotlinFilesByBasename(index);
|
|
442
|
-
// Workspace-alias resolver (Task 6) — no-op when index.workspaces is absent.
|
|
443
|
-
const workspaceResolver = buildWorkspaceAliasResolver(index);
|
|
444
|
-
const edgeSet = new Set();
|
|
445
|
-
const edges = [];
|
|
446
|
-
// Rollback kill switch — skip Python import extraction if env var set
|
|
447
|
-
const pythonDisabled = process.env.CODESIFT_DISABLE_PYTHON_IMPORTS === "1";
|
|
448
|
-
// Python needs the full indexed file set for package resolution — built once
|
|
449
|
-
const indexedPyFileSet = new Set(index.files.filter((f) => f.path.endsWith(".py")).map((f) => f.path));
|
|
450
|
-
const pySrcLayout = indexedPyFileSet.size > 0
|
|
451
|
-
? detectSrcLayout([...indexedPyFileSet])
|
|
452
|
-
: null;
|
|
453
|
-
const files = fileFilter
|
|
454
|
-
? index.files.filter((f) => fileFilter.has(f.path))
|
|
455
|
-
: index.files;
|
|
456
|
-
const addEdge = (from, to, extras) => {
|
|
457
|
-
if (to === from)
|
|
458
|
-
return;
|
|
459
|
-
const edgeKey = `${from}->${to}`;
|
|
460
|
-
if (edgeSet.has(edgeKey)) {
|
|
461
|
-
// Upgrade: runtime import overrides a prior type_only edge
|
|
462
|
-
if (!extras?.type_only) {
|
|
463
|
-
const existing = edges.find((e) => e.from === from && e.to === to);
|
|
464
|
-
if (existing?.type_only)
|
|
465
|
-
existing.type_only = false;
|
|
466
|
-
}
|
|
467
|
-
return;
|
|
468
|
-
}
|
|
469
|
-
edgeSet.add(edgeKey);
|
|
470
|
-
const edge = { from, to };
|
|
471
|
-
if (extras?.type_only)
|
|
472
|
-
edge.type_only = true;
|
|
473
|
-
if (extras?.star_import)
|
|
474
|
-
edge.star_import = true;
|
|
475
|
-
if (extras?.raw)
|
|
476
|
-
edge.raw = extras.raw;
|
|
477
|
-
edges.push(edge);
|
|
478
|
-
};
|
|
479
|
-
for (const file of files) {
|
|
480
|
-
let source;
|
|
481
|
-
try {
|
|
482
|
-
source = await readFile(join(index.root, file.path), "utf-8");
|
|
483
|
-
}
|
|
484
|
-
catch {
|
|
485
|
-
continue;
|
|
486
|
-
}
|
|
487
|
-
// TS/TSX AST-based extraction with type_only flagging + tsconfig alias
|
|
488
|
-
// resolution. Skip the regex path for these files; fall back to regex
|
|
489
|
-
// ONLY if AST extraction throws (parse failure).
|
|
490
|
-
const isTsFile = /\.tsx?$/.test(file.path);
|
|
491
|
-
let tsAstHandled = false;
|
|
492
|
-
if (isTsFile) {
|
|
493
|
-
try {
|
|
494
|
-
const lang = file.path.endsWith(".tsx") ? "tsx" : "typescript";
|
|
495
|
-
const parser = await getParser(lang);
|
|
496
|
-
if (parser) {
|
|
497
|
-
let tree = getCachedParse(lang, source);
|
|
498
|
-
if (!tree) {
|
|
499
|
-
tree = parser.parse(source);
|
|
500
|
-
// parse() is nullable since web-tree-sitter 0.25 — a file that will
|
|
501
|
-
// not parse simply contributes no import edges, and must not be
|
|
502
|
-
// written into the parse cache as if it had.
|
|
503
|
-
if (!tree)
|
|
504
|
-
continue;
|
|
505
|
-
setCachedParse(lang, source, tree);
|
|
506
|
-
}
|
|
507
|
-
const tsImports = extractTypeScriptImports(tree);
|
|
508
|
-
for (const imp of tsImports) {
|
|
509
|
-
let resolved = null;
|
|
510
|
-
if (imp.path.startsWith(".")) {
|
|
511
|
-
let norm = resolveImportPath(file.path, imp.path);
|
|
512
|
-
// resolveImportPath emits leading "./" when importer is at repo root.
|
|
513
|
-
// Strip it so the lookup matches normalizedPaths keys (which never
|
|
514
|
-
// have leading "./").
|
|
515
|
-
if (norm.startsWith("./"))
|
|
516
|
-
norm = norm.slice(2);
|
|
517
|
-
if (normalizedPaths.has(norm))
|
|
518
|
-
resolved = normalizedPaths.get(norm) ?? null;
|
|
519
|
-
}
|
|
520
|
-
else {
|
|
521
|
-
// Bare/aliased specifier: try tsconfig paths.
|
|
522
|
-
const aliased = resolveTsAliasedImport(join(index.root, file.path), imp.path, index.root);
|
|
523
|
-
if (aliased) {
|
|
524
|
-
// Only treat as in-repo when resolved path is under index.root
|
|
525
|
-
// (relative() alone can escape with ".." for outside paths).
|
|
526
|
-
const rootAbs = resolve(index.root);
|
|
527
|
-
const aliasAbs = resolve(aliased);
|
|
528
|
-
const relRaw = relative(rootAbs, aliasAbs);
|
|
529
|
-
const inside = relRaw !== "" &&
|
|
530
|
-
!isAbsolute(relRaw) &&
|
|
531
|
-
!relRaw.startsWith("..");
|
|
532
|
-
if (inside) {
|
|
533
|
-
const rel = relRaw.split(sep).join("/");
|
|
534
|
-
if (normalizedPaths.has(rel.replace(/\.[^./]+$/, ""))
|
|
535
|
-
|| index.files.some((f) => f.path === rel)) {
|
|
536
|
-
resolved = rel;
|
|
537
|
-
}
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
}
|
|
541
|
-
if (resolved) {
|
|
542
|
-
addEdge(file.path, resolved, { type_only: imp.is_type_only });
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
tsAstHandled = true;
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
catch (err) {
|
|
549
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
550
|
-
console.warn(`[import-graph] TS AST extraction failed for ${file.path}; falling back to regex: ${message}`);
|
|
551
|
-
// Falls through to regex extractImports below.
|
|
552
|
-
}
|
|
553
|
-
}
|
|
554
|
-
// Regex path: JS/JSX/PHP files always; TS/TSX only on AST-failure fallback.
|
|
555
|
-
if (!tsAstHandled) {
|
|
556
|
-
const importPaths = extractImports(source);
|
|
557
|
-
for (const importPath of importPaths) {
|
|
558
|
-
const resolved = resolveImportPath(file.path, importPath);
|
|
559
|
-
const targetFile = normalizedPaths.get(resolved);
|
|
560
|
-
// type_only stays undefined on regex fallback — find_circular_deps
|
|
561
|
-
// treats undefined as runtime, which preserves cycle detection for
|
|
562
|
-
// JS/JSX/PHP and accepts a small false-positive risk on TS-fallback files.
|
|
563
|
-
if (targetFile)
|
|
564
|
-
addEdge(file.path, targetFile);
|
|
565
|
-
}
|
|
566
|
-
}
|
|
567
|
-
// Workspace-alias / tsconfig-paths imports (JS/TS only when monorepo).
|
|
568
|
-
// Activated only when `index.workspaces` is non-null. Adds cross-package
|
|
569
|
-
// edges so find_references / impact_analysis / trace_call_chain see
|
|
570
|
-
// bare-name imports like `@org/shared`.
|
|
571
|
-
if (workspaceResolver !== NULL_RESOLVER && /\.(astro|ts|tsx|js|jsx|mjs|cjs)$/.test(file.path)) {
|
|
572
|
-
const bareImports = extractBareImports(source);
|
|
573
|
-
for (const importPath of bareImports) {
|
|
574
|
-
const targetFile = workspaceResolver.resolve(importPath, file.path);
|
|
575
|
-
if (targetFile)
|
|
576
|
-
addEdge(file.path, targetFile);
|
|
577
|
-
}
|
|
578
|
-
}
|
|
579
|
-
// Kotlin fully-qualified imports (.kt/.kts files only)
|
|
580
|
-
if (/\.kts?$/.test(file.path)) {
|
|
581
|
-
const kotlinImports = extractKotlinImports(source);
|
|
582
|
-
for (const fqName of kotlinImports) {
|
|
583
|
-
const targetFile = resolveKotlinImport(fqName, kotlinFilesByBasename);
|
|
584
|
-
if (targetFile)
|
|
585
|
-
addEdge(file.path, targetFile);
|
|
586
|
-
}
|
|
587
|
-
}
|
|
588
|
-
// PHP cross-file edges via PSR-4 `use` statement resolution.
|
|
589
|
-
// Creates edges like: PostController.php → User.php when we see
|
|
590
|
-
// `use App\Models\User;` and composer.json maps `App\` to `src/`.
|
|
591
|
-
if (file.path.endsWith(".php")) {
|
|
592
|
-
const uses = extractPhpUseStatements(source);
|
|
593
|
-
for (const fqcn of uses) {
|
|
594
|
-
try {
|
|
595
|
-
const resolved = await resolvePhpNamespace(index.repo, fqcn);
|
|
596
|
-
if (resolved.exists && resolved.file_path) {
|
|
597
|
-
const candidate = resolved.file_path.replace(/^\.\//, "");
|
|
598
|
-
// Prefer the exact indexed path (handles prefixes like "./src/")
|
|
599
|
-
const targetFile = index.files.some((f) => f.path === candidate)
|
|
600
|
-
? candidate
|
|
601
|
-
: normalizedPaths.get(candidate.replace(/\.php$/, "")) ?? null;
|
|
602
|
-
if (targetFile && targetFile !== file.path) {
|
|
603
|
-
addEdge(file.path, targetFile);
|
|
604
|
-
}
|
|
605
|
-
}
|
|
606
|
-
}
|
|
607
|
-
catch {
|
|
608
|
-
// Missing composer.json, malformed PSR-4, etc. — skip edge, don't crash.
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
// Python imports via tree-sitter AST + package-aware resolution.
|
|
613
|
-
// Uses parse cache to avoid re-parsing files already parsed by the
|
|
614
|
-
// symbol extractor pipeline — Python files are the only ones parsed
|
|
615
|
-
// twice per index (once for symbols, once for imports here).
|
|
616
|
-
if (!pythonDisabled && file.path.endsWith(".py")) {
|
|
617
|
-
try {
|
|
618
|
-
const parser = await getParser("python");
|
|
619
|
-
if (parser) {
|
|
620
|
-
let tree = getCachedParse("python", source);
|
|
621
|
-
if (!tree) {
|
|
622
|
-
tree = parser.parse(source);
|
|
623
|
-
// parse() is nullable since web-tree-sitter 0.25 — a file that will
|
|
624
|
-
// not parse simply contributes no import edges, and must not be
|
|
625
|
-
// written into the parse cache as if it had.
|
|
626
|
-
if (!tree)
|
|
627
|
-
continue;
|
|
628
|
-
setCachedParse("python", source, tree);
|
|
629
|
-
}
|
|
630
|
-
const pyImports = extractPythonImports(tree);
|
|
631
|
-
for (const imp of pyImports) {
|
|
632
|
-
const targetFile = resolvePythonImport({ module: imp.module, level: imp.level }, file.path, indexedPyFileSet, pySrcLayout);
|
|
633
|
-
if (targetFile) {
|
|
634
|
-
addEdge(file.path, targetFile, {
|
|
635
|
-
type_only: imp.is_type_only,
|
|
636
|
-
star_import: imp.is_star,
|
|
637
|
-
});
|
|
638
|
-
}
|
|
639
|
-
}
|
|
640
|
-
}
|
|
641
|
-
}
|
|
642
|
-
catch (err) {
|
|
643
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
644
|
-
console.warn(`[import-graph] python extraction failed for ${file.path}: ${message}`);
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
}
|
|
648
|
-
return edges;
|
|
649
|
-
}
|
|
650
|
-
/**
|
|
651
|
-
* Compute file-level PageRank from import edges.
|
|
652
|
-
*
|
|
653
|
-
* Returns a Map of file path → PageRank score (sums to ~1). Isolated nodes
|
|
654
|
-
* (files with neither incoming nor outgoing edges) are pre-filtered. On
|
|
655
|
-
* empty input or a graphology/pagerank failure, returns an empty Map.
|
|
656
|
-
* Used by wiki-hub-ranker (spec D4 Layer 2).
|
|
657
|
-
*/
|
|
658
|
-
export function buildFilePageRank(edges) {
|
|
659
|
-
if (edges.length === 0)
|
|
660
|
-
return new Map();
|
|
661
|
-
try {
|
|
662
|
-
const graph = new DirectedGraph();
|
|
663
|
-
for (const edge of edges) {
|
|
664
|
-
if (!graph.hasNode(edge.from))
|
|
665
|
-
graph.addNode(edge.from);
|
|
666
|
-
if (!graph.hasNode(edge.to))
|
|
667
|
-
graph.addNode(edge.to);
|
|
668
|
-
if (edge.from === edge.to)
|
|
669
|
-
continue;
|
|
670
|
-
if (!graph.hasEdge(edge.from, edge.to))
|
|
671
|
-
graph.addEdge(edge.from, edge.to);
|
|
672
|
-
}
|
|
673
|
-
if (graph.order === 0)
|
|
674
|
-
return new Map();
|
|
675
|
-
const scores = pagerank(graph);
|
|
676
|
-
return new Map(Object.entries(scores));
|
|
677
|
-
}
|
|
678
|
-
catch {
|
|
679
|
-
return new Map();
|
|
680
|
-
}
|
|
681
|
-
}
|
|
682
|
-
/**
|
|
683
|
-
* Build adjacency lists (bidirectional) from import edges.
|
|
684
|
-
*/
|
|
685
|
-
export function buildImportAdjacency(edges) {
|
|
686
|
-
const adj = new Map();
|
|
687
|
-
for (const edge of edges) {
|
|
688
|
-
let fromSet = adj.get(edge.from);
|
|
689
|
-
if (!fromSet) {
|
|
690
|
-
fromSet = new Set();
|
|
691
|
-
adj.set(edge.from, fromSet);
|
|
692
|
-
}
|
|
693
|
-
fromSet.add(edge.to);
|
|
694
|
-
let toSet = adj.get(edge.to);
|
|
695
|
-
if (!toSet) {
|
|
696
|
-
toSet = new Set();
|
|
697
|
-
adj.set(edge.to, toSet);
|
|
698
|
-
}
|
|
699
|
-
toSet.add(edge.from);
|
|
700
|
-
}
|
|
701
|
-
return adj;
|
|
702
|
-
}
|
|
1
|
+
export { extractImports, extractBareImports } from "./import-graph/source-imports.js";
|
|
2
|
+
export { buildNormalizedPathMap, resolveImportPath } from "./import-graph/path-map.js";
|
|
3
|
+
export { buildKotlinFilesByBasename, extractKotlinImports, extractPhpUseStatements, resolveKotlinImport, } from "./import-graph/language-imports.js";
|
|
4
|
+
export { buildWorkspaceAliasResolver } from "./import-graph/workspace-alias.js";
|
|
5
|
+
export { collectImportEdges } from "./import-graph/collect.js";
|
|
6
|
+
export { buildFilePageRank, buildImportAdjacency } from "./import-graph/metrics.js";
|
|
703
7
|
//# sourceMappingURL=import-graph.js.map
|