codesift-mcp 0.2.18 → 0.4.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 +143 -20
- package/dist/cache/hono-cache.d.ts +50 -0
- package/dist/cache/hono-cache.d.ts.map +1 -0
- package/dist/cache/hono-cache.js +132 -0
- package/dist/cache/hono-cache.js.map +1 -0
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +17 -2
- package/dist/cli/setup.js.map +1 -1
- package/dist/formatters-shortening.d.ts +13 -0
- package/dist/formatters-shortening.d.ts.map +1 -1
- package/dist/formatters-shortening.js +131 -0
- package/dist/formatters-shortening.js.map +1 -1
- package/dist/formatters.d.ts +38 -0
- package/dist/formatters.d.ts.map +1 -1
- package/dist/formatters.js +498 -0
- package/dist/formatters.js.map +1 -1
- package/dist/instructions.d.ts +1 -1
- package/dist/instructions.d.ts.map +1 -1
- package/dist/instructions.js +27 -26
- package/dist/instructions.js.map +1 -1
- package/dist/lsp/lsp-servers.d.ts.map +1 -1
- package/dist/lsp/lsp-servers.js +5 -0
- package/dist/lsp/lsp-servers.js.map +1 -1
- package/dist/lsp/lsp-tools.d.ts.map +1 -1
- package/dist/lsp/lsp-tools.js +1 -0
- package/dist/lsp/lsp-tools.js.map +1 -1
- package/dist/parser/astro-template.d.ts +47 -0
- package/dist/parser/astro-template.d.ts.map +1 -0
- package/dist/parser/astro-template.js +171 -0
- package/dist/parser/astro-template.js.map +1 -0
- package/dist/parser/extractors/_shared.d.ts +4 -0
- package/dist/parser/extractors/_shared.d.ts.map +1 -1
- package/dist/parser/extractors/_shared.js +8 -0
- package/dist/parser/extractors/_shared.js.map +1 -1
- package/dist/parser/extractors/astro.d.ts +4 -5
- package/dist/parser/extractors/astro.d.ts.map +1 -1
- package/dist/parser/extractors/astro.js +102 -26
- package/dist/parser/extractors/astro.js.map +1 -1
- package/dist/parser/extractors/gradle-kts.d.ts +4 -0
- package/dist/parser/extractors/gradle-kts.d.ts.map +1 -0
- package/dist/parser/extractors/gradle-kts.js +246 -0
- package/dist/parser/extractors/gradle-kts.js.map +1 -0
- package/dist/parser/extractors/hono-inline-analyzer.d.ts +34 -0
- package/dist/parser/extractors/hono-inline-analyzer.d.ts.map +1 -0
- package/dist/parser/extractors/hono-inline-analyzer.js +465 -0
- package/dist/parser/extractors/hono-inline-analyzer.js.map +1 -0
- package/dist/parser/extractors/hono-model.d.ts +196 -0
- package/dist/parser/extractors/hono-model.d.ts.map +1 -0
- package/dist/parser/extractors/hono-model.js +10 -0
- package/dist/parser/extractors/hono-model.js.map +1 -0
- package/dist/parser/extractors/hono.d.ts +118 -0
- package/dist/parser/extractors/hono.d.ts.map +1 -0
- package/dist/parser/extractors/hono.js +1527 -0
- package/dist/parser/extractors/hono.js.map +1 -0
- package/dist/parser/extractors/kotlin.d.ts +4 -0
- package/dist/parser/extractors/kotlin.d.ts.map +1 -0
- package/dist/parser/extractors/kotlin.js +521 -0
- package/dist/parser/extractors/kotlin.js.map +1 -0
- package/dist/parser/extractors/php.d.ts +22 -0
- package/dist/parser/extractors/php.d.ts.map +1 -0
- package/dist/parser/extractors/php.js +326 -0
- package/dist/parser/extractors/php.js.map +1 -0
- package/dist/parser/extractors/python.d.ts.map +1 -1
- package/dist/parser/extractors/python.js +234 -11
- package/dist/parser/extractors/python.js.map +1 -1
- package/dist/parser/extractors/sql.d.ts +33 -0
- package/dist/parser/extractors/sql.d.ts.map +1 -0
- package/dist/parser/extractors/sql.js +506 -0
- package/dist/parser/extractors/sql.js.map +1 -0
- package/dist/parser/extractors/typescript.d.ts.map +1 -1
- package/dist/parser/extractors/typescript.js +166 -3
- package/dist/parser/extractors/typescript.js.map +1 -1
- package/dist/parser/languages/tree-sitter-javascript.wasm +0 -0
- package/dist/parser/languages/tree-sitter-kotlin.wasm +0 -0
- package/dist/parser/languages/tree-sitter-php.wasm +0 -0
- package/dist/parser/languages/tree-sitter-php_only.wasm +0 -0
- package/dist/parser/languages/tree-sitter-python.wasm +0 -0
- package/dist/parser/parser-manager.d.ts +32 -0
- package/dist/parser/parser-manager.d.ts.map +1 -1
- package/dist/parser/parser-manager.js +82 -3
- package/dist/parser/parser-manager.js.map +1 -1
- package/dist/parser/symbol-extractor.d.ts.map +1 -1
- package/dist/parser/symbol-extractor.js +16 -0
- package/dist/parser/symbol-extractor.js.map +1 -1
- package/dist/register-tools.d.ts +37 -1
- package/dist/register-tools.d.ts.map +1 -1
- package/dist/register-tools.js +2657 -191
- package/dist/register-tools.js.map +1 -1
- package/dist/search/reranker.js +1 -1
- package/dist/search/reranker.js.map +1 -1
- package/dist/server-helpers.d.ts.map +1 -1
- package/dist/server-helpers.js +11 -0
- package/dist/server-helpers.js.map +1 -1
- package/dist/server.js +28 -1
- package/dist/server.js.map +1 -1
- package/dist/storage/index-store.d.ts +15 -1
- package/dist/storage/index-store.d.ts.map +1 -1
- package/dist/storage/index-store.js +27 -1
- package/dist/storage/index-store.js.map +1 -1
- package/dist/storage/session-state.d.ts +1 -1
- package/dist/storage/session-state.d.ts.map +1 -1
- package/dist/storage/session-state.js +6 -4
- package/dist/storage/session-state.js.map +1 -1
- package/dist/tools/agent-config-tools.d.ts +24 -0
- package/dist/tools/agent-config-tools.d.ts.map +1 -0
- package/dist/tools/agent-config-tools.js +119 -0
- package/dist/tools/agent-config-tools.js.map +1 -0
- package/dist/tools/architecture-tools.d.ts +23 -0
- package/dist/tools/architecture-tools.d.ts.map +1 -0
- package/dist/tools/architecture-tools.js +140 -0
- package/dist/tools/architecture-tools.js.map +1 -0
- package/dist/tools/astro-config.d.ts +33 -0
- package/dist/tools/astro-config.d.ts.map +1 -0
- package/dist/tools/astro-config.js +260 -0
- package/dist/tools/astro-config.js.map +1 -0
- package/dist/tools/astro-islands.d.ts +61 -0
- package/dist/tools/astro-islands.d.ts.map +1 -0
- package/dist/tools/astro-islands.js +240 -0
- package/dist/tools/astro-islands.js.map +1 -0
- package/dist/tools/astro-routes.d.ts +49 -0
- package/dist/tools/astro-routes.d.ts.map +1 -0
- package/dist/tools/astro-routes.js +119 -0
- package/dist/tools/astro-routes.js.map +1 -0
- package/dist/tools/audit-tools.d.ts +38 -0
- package/dist/tools/audit-tools.d.ts.map +1 -0
- package/dist/tools/audit-tools.js +248 -0
- package/dist/tools/audit-tools.js.map +1 -0
- package/dist/tools/celery-tools.d.ts +38 -0
- package/dist/tools/celery-tools.d.ts.map +1 -0
- package/dist/tools/celery-tools.js +154 -0
- package/dist/tools/celery-tools.js.map +1 -0
- package/dist/tools/clone-tools.js +1 -1
- package/dist/tools/clone-tools.js.map +1 -1
- package/dist/tools/complexity-tools.d.ts +4 -0
- package/dist/tools/complexity-tools.d.ts.map +1 -1
- package/dist/tools/complexity-tools.js +78 -4
- package/dist/tools/complexity-tools.js.map +1 -1
- package/dist/tools/compose-tools.d.ts +60 -0
- package/dist/tools/compose-tools.d.ts.map +1 -0
- package/dist/tools/compose-tools.js +203 -0
- package/dist/tools/compose-tools.js.map +1 -0
- package/dist/tools/coupling-tools.d.ts +50 -0
- package/dist/tools/coupling-tools.d.ts.map +1 -0
- package/dist/tools/coupling-tools.js +262 -0
- package/dist/tools/coupling-tools.js.map +1 -0
- package/dist/tools/dependency-audit-tools.d.ts +65 -0
- package/dist/tools/dependency-audit-tools.d.ts.map +1 -0
- package/dist/tools/dependency-audit-tools.js +553 -0
- package/dist/tools/dependency-audit-tools.js.map +1 -0
- package/dist/tools/django-settings.d.ts +22 -0
- package/dist/tools/django-settings.d.ts.map +1 -0
- package/dist/tools/django-settings.js +301 -0
- package/dist/tools/django-settings.js.map +1 -0
- package/dist/tools/frequency-tools.js +1 -1
- package/dist/tools/frequency-tools.js.map +1 -1
- package/dist/tools/graph-tools.d.ts +8 -2
- package/dist/tools/graph-tools.d.ts.map +1 -1
- package/dist/tools/graph-tools.js +44 -3
- package/dist/tools/graph-tools.js.map +1 -1
- package/dist/tools/hilt-tools.d.ts +55 -0
- package/dist/tools/hilt-tools.d.ts.map +1 -0
- package/dist/tools/hilt-tools.js +258 -0
- package/dist/tools/hilt-tools.js.map +1 -0
- package/dist/tools/hono-analyze-app.d.ts +48 -0
- package/dist/tools/hono-analyze-app.d.ts.map +1 -0
- package/dist/tools/hono-analyze-app.js +102 -0
- package/dist/tools/hono-analyze-app.js.map +1 -0
- package/dist/tools/hono-api-contract.d.ts +22 -0
- package/dist/tools/hono-api-contract.d.ts.map +1 -0
- package/dist/tools/hono-api-contract.js +80 -0
- package/dist/tools/hono-api-contract.js.map +1 -0
- package/dist/tools/hono-conditional-middleware.d.ts +27 -0
- package/dist/tools/hono-conditional-middleware.d.ts.map +1 -0
- package/dist/tools/hono-conditional-middleware.js +62 -0
- package/dist/tools/hono-conditional-middleware.js.map +1 -0
- package/dist/tools/hono-context-flow.d.ts +24 -0
- package/dist/tools/hono-context-flow.d.ts.map +1 -0
- package/dist/tools/hono-context-flow.js +78 -0
- package/dist/tools/hono-context-flow.js.map +1 -0
- package/dist/tools/hono-dead-routes.d.ts +26 -0
- package/dist/tools/hono-dead-routes.d.ts.map +1 -0
- package/dist/tools/hono-dead-routes.js +109 -0
- package/dist/tools/hono-dead-routes.js.map +1 -0
- package/dist/tools/hono-env-regression.d.ts +29 -0
- package/dist/tools/hono-env-regression.d.ts.map +1 -0
- package/dist/tools/hono-env-regression.js +157 -0
- package/dist/tools/hono-env-regression.js.map +1 -0
- package/dist/tools/hono-inline-analyze.d.ts +31 -0
- package/dist/tools/hono-inline-analyze.d.ts.map +1 -0
- package/dist/tools/hono-inline-analyze.js +67 -0
- package/dist/tools/hono-inline-analyze.js.map +1 -0
- package/dist/tools/hono-middleware-chain.d.ts +22 -0
- package/dist/tools/hono-middleware-chain.d.ts.map +1 -0
- package/dist/tools/hono-middleware-chain.js +84 -0
- package/dist/tools/hono-middleware-chain.js.map +1 -0
- package/dist/tools/hono-modules.d.ts +22 -0
- package/dist/tools/hono-modules.d.ts.map +1 -0
- package/dist/tools/hono-modules.js +126 -0
- package/dist/tools/hono-modules.js.map +1 -0
- package/dist/tools/hono-response-types.d.ts +37 -0
- package/dist/tools/hono-response-types.d.ts.map +1 -0
- package/dist/tools/hono-response-types.js +84 -0
- package/dist/tools/hono-response-types.js.map +1 -0
- package/dist/tools/hono-rpc-types.d.ts +21 -0
- package/dist/tools/hono-rpc-types.d.ts.map +1 -0
- package/dist/tools/hono-rpc-types.js +57 -0
- package/dist/tools/hono-rpc-types.js.map +1 -0
- package/dist/tools/hono-security.d.ts +21 -0
- package/dist/tools/hono-security.d.ts.map +1 -0
- package/dist/tools/hono-security.js +98 -0
- package/dist/tools/hono-security.js.map +1 -0
- package/dist/tools/hono-visualize.d.ts +13 -0
- package/dist/tools/hono-visualize.d.ts.map +1 -0
- package/dist/tools/hono-visualize.js +72 -0
- package/dist/tools/hono-visualize.js.map +1 -0
- package/dist/tools/hotspot-tools.d.ts.map +1 -1
- package/dist/tools/hotspot-tools.js +9 -7
- package/dist/tools/hotspot-tools.js.map +1 -1
- package/dist/tools/index-tools.d.ts +17 -0
- package/dist/tools/index-tools.d.ts.map +1 -1
- package/dist/tools/index-tools.js +210 -10
- package/dist/tools/index-tools.js.map +1 -1
- package/dist/tools/kotlin-tools.d.ts +142 -0
- package/dist/tools/kotlin-tools.d.ts.map +1 -0
- package/dist/tools/kotlin-tools.js +572 -0
- package/dist/tools/kotlin-tools.js.map +1 -0
- package/dist/tools/legacy-hono-conventions.d.ts +14 -0
- package/dist/tools/legacy-hono-conventions.d.ts.map +1 -0
- package/dist/tools/legacy-hono-conventions.js +152 -0
- package/dist/tools/legacy-hono-conventions.js.map +1 -0
- package/dist/tools/migration-lint-tools.d.ts +26 -0
- package/dist/tools/migration-lint-tools.d.ts.map +1 -0
- package/dist/tools/migration-lint-tools.js +247 -0
- package/dist/tools/migration-lint-tools.js.map +1 -0
- package/dist/tools/model-tools.d.ts +30 -0
- package/dist/tools/model-tools.d.ts.map +1 -0
- package/dist/tools/model-tools.js +145 -0
- package/dist/tools/model-tools.js.map +1 -0
- package/dist/tools/nest-ext-tools.d.ts +92 -0
- package/dist/tools/nest-ext-tools.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools.js +359 -0
- package/dist/tools/nest-ext-tools.js.map +1 -0
- package/dist/tools/nest-tools.d.ts +171 -0
- package/dist/tools/nest-tools.d.ts.map +1 -0
- package/dist/tools/nest-tools.js +1042 -0
- package/dist/tools/nest-tools.js.map +1 -0
- package/dist/tools/nextjs-api-contract-readers.d.ts +14 -0
- package/dist/tools/nextjs-api-contract-readers.d.ts.map +1 -0
- package/dist/tools/nextjs-api-contract-readers.js +204 -0
- package/dist/tools/nextjs-api-contract-readers.js.map +1 -0
- package/dist/tools/nextjs-api-contract-tools.d.ts +57 -0
- package/dist/tools/nextjs-api-contract-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-api-contract-tools.js +144 -0
- package/dist/tools/nextjs-api-contract-tools.js.map +1 -0
- package/dist/tools/nextjs-boundary-tools.d.ts +39 -0
- package/dist/tools/nextjs-boundary-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-boundary-tools.js +152 -0
- package/dist/tools/nextjs-boundary-tools.js.map +1 -0
- package/dist/tools/nextjs-component-tools.d.ts +121 -0
- package/dist/tools/nextjs-component-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-component-tools.js +460 -0
- package/dist/tools/nextjs-component-tools.js.map +1 -0
- package/dist/tools/nextjs-data-flow-tools.d.ts +42 -0
- package/dist/tools/nextjs-data-flow-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-data-flow-tools.js +158 -0
- package/dist/tools/nextjs-data-flow-tools.js.map +1 -0
- package/dist/tools/nextjs-framework-audit-tools.d.ts +37 -0
- package/dist/tools/nextjs-framework-audit-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-framework-audit-tools.js +211 -0
- package/dist/tools/nextjs-framework-audit-tools.js.map +1 -0
- package/dist/tools/nextjs-link-tools.d.ts +41 -0
- package/dist/tools/nextjs-link-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-link-tools.js +157 -0
- package/dist/tools/nextjs-link-tools.js.map +1 -0
- package/dist/tools/nextjs-metadata-tools.d.ts +74 -0
- package/dist/tools/nextjs-metadata-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-metadata-tools.js +252 -0
- package/dist/tools/nextjs-metadata-tools.js.map +1 -0
- package/dist/tools/nextjs-middleware-coverage-tools.d.ts +41 -0
- package/dist/tools/nextjs-middleware-coverage-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-middleware-coverage-tools.js +88 -0
- package/dist/tools/nextjs-middleware-coverage-tools.js.map +1 -0
- package/dist/tools/nextjs-route-tools.d.ts +100 -0
- package/dist/tools/nextjs-route-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-route-tools.js +493 -0
- package/dist/tools/nextjs-route-tools.js.map +1 -0
- package/dist/tools/nextjs-security-readers.d.ts +22 -0
- package/dist/tools/nextjs-security-readers.d.ts.map +1 -0
- package/dist/tools/nextjs-security-readers.js +318 -0
- package/dist/tools/nextjs-security-readers.js.map +1 -0
- package/dist/tools/nextjs-security-scoring.d.ts +15 -0
- package/dist/tools/nextjs-security-scoring.d.ts.map +1 -0
- package/dist/tools/nextjs-security-scoring.js +65 -0
- package/dist/tools/nextjs-security-scoring.js.map +1 -0
- package/dist/tools/nextjs-security-tools.d.ts +75 -0
- package/dist/tools/nextjs-security-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-security-tools.js +153 -0
- package/dist/tools/nextjs-security-tools.js.map +1 -0
- package/dist/tools/nextjs-tools.d.ts +15 -0
- package/dist/tools/nextjs-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-tools.js +15 -0
- package/dist/tools/nextjs-tools.js.map +1 -0
- package/dist/tools/outline-tools.d.ts.map +1 -1
- package/dist/tools/outline-tools.js +20 -0
- package/dist/tools/outline-tools.js.map +1 -1
- package/dist/tools/pattern-tools.d.ts +8 -0
- package/dist/tools/pattern-tools.d.ts.map +1 -1
- package/dist/tools/pattern-tools.js +561 -3
- package/dist/tools/pattern-tools.js.map +1 -1
- package/dist/tools/perf-tools.d.ts +32 -0
- package/dist/tools/perf-tools.d.ts.map +1 -0
- package/dist/tools/perf-tools.js +227 -0
- package/dist/tools/perf-tools.js.map +1 -0
- package/dist/tools/php-tools.d.ts +176 -0
- package/dist/tools/php-tools.d.ts.map +1 -0
- package/dist/tools/php-tools.js +543 -0
- package/dist/tools/php-tools.js.map +1 -0
- package/dist/tools/prisma-schema-tools.d.ts +44 -0
- package/dist/tools/prisma-schema-tools.d.ts.map +1 -0
- package/dist/tools/prisma-schema-tools.js +358 -0
- package/dist/tools/prisma-schema-tools.js.map +1 -0
- package/dist/tools/project-tools.d.ts +115 -6
- package/dist/tools/project-tools.d.ts.map +1 -1
- package/dist/tools/project-tools.js +594 -217
- package/dist/tools/project-tools.js.map +1 -1
- package/dist/tools/pyproject-tools.d.ts +23 -0
- package/dist/tools/pyproject-tools.d.ts.map +1 -0
- package/dist/tools/pyproject-tools.js +133 -0
- package/dist/tools/pyproject-tools.js.map +1 -0
- package/dist/tools/pytest-tools.d.ts +20 -0
- package/dist/tools/pytest-tools.d.ts.map +1 -0
- package/dist/tools/pytest-tools.js +106 -0
- package/dist/tools/pytest-tools.js.map +1 -0
- package/dist/tools/python-callers.d.ts +28 -0
- package/dist/tools/python-callers.d.ts.map +1 -0
- package/dist/tools/python-callers.js +110 -0
- package/dist/tools/python-callers.js.map +1 -0
- package/dist/tools/python-circular-imports.d.ts +19 -0
- package/dist/tools/python-circular-imports.d.ts.map +1 -0
- package/dist/tools/python-circular-imports.js +126 -0
- package/dist/tools/python-circular-imports.js.map +1 -0
- package/dist/tools/python-deps-analyzer.d.ts +46 -0
- package/dist/tools/python-deps-analyzer.d.ts.map +1 -0
- package/dist/tools/python-deps-analyzer.js +227 -0
- package/dist/tools/python-deps-analyzer.js.map +1 -0
- package/dist/tools/query-tools.d.ts +23 -0
- package/dist/tools/query-tools.d.ts.map +1 -0
- package/dist/tools/query-tools.js +256 -0
- package/dist/tools/query-tools.js.map +1 -0
- package/dist/tools/react-tools.d.ts +218 -0
- package/dist/tools/react-tools.d.ts.map +1 -0
- package/dist/tools/react-tools.js +714 -0
- package/dist/tools/react-tools.js.map +1 -0
- package/dist/tools/report-tools.js +47 -0
- package/dist/tools/report-tools.js.map +1 -1
- package/dist/tools/review-diff-tools.d.ts +2 -6
- package/dist/tools/review-diff-tools.d.ts.map +1 -1
- package/dist/tools/review-diff-tools.js +51 -66
- package/dist/tools/review-diff-tools.js.map +1 -1
- package/dist/tools/room-tools.d.ts +36 -0
- package/dist/tools/room-tools.d.ts.map +1 -0
- package/dist/tools/room-tools.js +147 -0
- package/dist/tools/room-tools.js.map +1 -0
- package/dist/tools/route-tools.d.ts +27 -1
- package/dist/tools/route-tools.d.ts.map +1 -1
- package/dist/tools/route-tools.js +744 -18
- package/dist/tools/route-tools.js.map +1 -1
- package/dist/tools/ruff-tools.d.ts +32 -0
- package/dist/tools/ruff-tools.d.ts.map +1 -0
- package/dist/tools/ruff-tools.js +114 -0
- package/dist/tools/ruff-tools.js.map +1 -0
- package/dist/tools/search-ranker.d.ts.map +1 -1
- package/dist/tools/search-ranker.js +7 -0
- package/dist/tools/search-ranker.js.map +1 -1
- package/dist/tools/serialization-tools.d.ts +24 -0
- package/dist/tools/serialization-tools.d.ts.map +1 -0
- package/dist/tools/serialization-tools.js +156 -0
- package/dist/tools/serialization-tools.js.map +1 -0
- package/dist/tools/sql-tools.d.ts +234 -0
- package/dist/tools/sql-tools.d.ts.map +1 -0
- package/dist/tools/sql-tools.js +1037 -0
- package/dist/tools/sql-tools.js.map +1 -0
- package/dist/tools/status-tools.d.ts +10 -0
- package/dist/tools/status-tools.d.ts.map +1 -0
- package/dist/tools/status-tools.js +32 -0
- package/dist/tools/status-tools.js.map +1 -0
- package/dist/tools/symbol-tools.d.ts +19 -0
- package/dist/tools/symbol-tools.d.ts.map +1 -1
- package/dist/tools/symbol-tools.js +78 -4
- package/dist/tools/symbol-tools.js.map +1 -1
- package/dist/tools/test-impact-tools.d.ts +29 -0
- package/dist/tools/test-impact-tools.d.ts.map +1 -0
- package/dist/tools/test-impact-tools.js +156 -0
- package/dist/tools/test-impact-tools.js.map +1 -0
- package/dist/tools/typecheck-tools.d.ts +39 -0
- package/dist/tools/typecheck-tools.d.ts.map +1 -0
- package/dist/tools/typecheck-tools.js +191 -0
- package/dist/tools/typecheck-tools.js.map +1 -0
- package/dist/tools/wiring-tools.d.ts +19 -0
- package/dist/tools/wiring-tools.d.ts.map +1 -0
- package/dist/tools/wiring-tools.js +147 -0
- package/dist/tools/wiring-tools.js.map +1 -0
- package/dist/types.d.ts +9 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/framework-detect.d.ts +18 -2
- package/dist/utils/framework-detect.d.ts.map +1 -1
- package/dist/utils/framework-detect.js +150 -3
- package/dist/utils/framework-detect.js.map +1 -1
- package/dist/utils/import-graph.d.ts +36 -0
- package/dist/utils/import-graph.d.ts.map +1 -1
- package/dist/utils/import-graph.js +212 -9
- package/dist/utils/import-graph.js.map +1 -1
- package/dist/utils/language-detect.d.ts +21 -0
- package/dist/utils/language-detect.d.ts.map +1 -0
- package/dist/utils/language-detect.js +183 -0
- package/dist/utils/language-detect.js.map +1 -0
- package/dist/utils/nextjs-ast-readers.d.ts +44 -0
- package/dist/utils/nextjs-ast-readers.d.ts.map +1 -0
- package/dist/utils/nextjs-ast-readers.js +341 -0
- package/dist/utils/nextjs-ast-readers.js.map +1 -0
- package/dist/utils/nextjs-audit-cache.d.ts +51 -0
- package/dist/utils/nextjs-audit-cache.d.ts.map +1 -0
- package/dist/utils/nextjs-audit-cache.js +116 -0
- package/dist/utils/nextjs-audit-cache.js.map +1 -0
- package/dist/utils/nextjs-metadata-readers.d.ts +65 -0
- package/dist/utils/nextjs-metadata-readers.d.ts.map +1 -0
- package/dist/utils/nextjs-metadata-readers.js +447 -0
- package/dist/utils/nextjs-metadata-readers.js.map +1 -0
- package/dist/utils/nextjs.d.ts +42 -0
- package/dist/utils/nextjs.d.ts.map +1 -0
- package/dist/utils/nextjs.js +284 -0
- package/dist/utils/nextjs.js.map +1 -0
- package/dist/utils/python-import-resolver.d.ts +42 -0
- package/dist/utils/python-import-resolver.d.ts.map +1 -0
- package/dist/utils/python-import-resolver.js +101 -0
- package/dist/utils/python-import-resolver.js.map +1 -0
- package/dist/utils/python-imports.d.ts +28 -0
- package/dist/utils/python-imports.d.ts.map +1 -0
- package/dist/utils/python-imports.js +117 -0
- package/dist/utils/python-imports.js.map +1 -0
- package/dist/utils/react-alias.d.ts +15 -0
- package/dist/utils/react-alias.d.ts.map +1 -0
- package/dist/utils/react-alias.js +31 -0
- package/dist/utils/react-alias.js.map +1 -0
- package/dist/utils/test-file.d.ts.map +1 -1
- package/dist/utils/test-file.js +7 -0
- package/dist/utils/test-file.js.map +1 -1
- package/dist/utils/walk.d.ts +22 -0
- package/dist/utils/walk.d.ts.map +1 -1
- package/dist/utils/walk.js +70 -2
- package/dist/utils/walk.js.map +1 -1
- package/package.json +3 -2
- package/rules/codesift.md +34 -5
- package/rules/codesift.mdc +34 -5
- package/rules/codex.md +34 -5
- package/rules/gemini.md +34 -5
- package/src/parser/languages/tree-sitter-javascript.wasm +0 -0
- package/src/parser/languages/tree-sitter-kotlin.wasm +0 -0
- package/src/parser/languages/tree-sitter-php.wasm +0 -0
- package/src/parser/languages/tree-sitter-php_only.wasm +0 -0
- package/src/parser/languages/tree-sitter-python.wasm +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getCodeIndex } from "./index-tools.js";
|
|
2
2
|
import { isTestFileStrict as isTestFile } from "../utils/test-file.js";
|
|
3
3
|
const ANALYZABLE_KINDS = new Set([
|
|
4
|
-
"function", "method", "class",
|
|
4
|
+
"function", "method", "class", "component", "hook",
|
|
5
5
|
]);
|
|
6
6
|
// Patterns that increase cyclomatic complexity (decision points)
|
|
7
7
|
const BRANCH_PATTERNS = [
|
|
@@ -13,9 +13,18 @@ const BRANCH_PATTERNS = [
|
|
|
13
13
|
/\&\&/g,
|
|
14
14
|
/\|\|/g,
|
|
15
15
|
/\?\?/g, // nullish coalescing
|
|
16
|
+
// Kotlin branch patterns
|
|
17
|
+
/\bwhen\s*[\({]/g, // when expression/statement
|
|
18
|
+
/\?\.let\s*\{/g, // safe call + lambda
|
|
19
|
+
/\?\.run\s*\{/g, // safe call + run
|
|
20
|
+
/\?:/g, // Elvis operator
|
|
21
|
+
// PHP branch patterns
|
|
22
|
+
/\bforeach\s*\(/g, // foreach loop
|
|
23
|
+
/\belseif\s*\(/g, // PHP elseif (one word)
|
|
24
|
+
/\bmatch\s*\(/g, // PHP 8 match expression
|
|
16
25
|
];
|
|
17
26
|
// Patterns that increase nesting
|
|
18
|
-
const NESTING_OPENERS = /\b(if|for|while|switch|try)\s*[\({]/g;
|
|
27
|
+
const NESTING_OPENERS = /\b(if|for|foreach|while|switch|try|when|match)\s*[\({]/g;
|
|
19
28
|
/**
|
|
20
29
|
* Estimate cyclomatic complexity from source text.
|
|
21
30
|
* Counts decision points: if, else if, case, catch, &&, ||, ??, ternary.
|
|
@@ -31,6 +40,53 @@ function countBranches(source) {
|
|
|
31
40
|
}
|
|
32
41
|
return branches;
|
|
33
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Count React hook calls in source text.
|
|
45
|
+
* Returns { total, state, effect } for useState, useEffect, and generic use*() calls.
|
|
46
|
+
*/
|
|
47
|
+
function countReactHooks(source) {
|
|
48
|
+
let total = 0;
|
|
49
|
+
let state = 0;
|
|
50
|
+
let effect = 0;
|
|
51
|
+
const pattern = /\b(use[A-Z]\w*)\s*\(/g;
|
|
52
|
+
let m;
|
|
53
|
+
while ((m = pattern.exec(source)) !== null) {
|
|
54
|
+
const name = m[1];
|
|
55
|
+
total++;
|
|
56
|
+
if (name === "useState")
|
|
57
|
+
state++;
|
|
58
|
+
else if (name === "useEffect")
|
|
59
|
+
effect++;
|
|
60
|
+
}
|
|
61
|
+
return { total, state, effect };
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Estimate max JSX nesting depth by tracking < and </.
|
|
65
|
+
* Counts opening tags (<PascalCase or <lowercase) minus self-closing.
|
|
66
|
+
* Heuristic: scan linearly and track stack depth.
|
|
67
|
+
*/
|
|
68
|
+
function estimateJsxDepth(source) {
|
|
69
|
+
let maxDepth = 0;
|
|
70
|
+
let depth = 0;
|
|
71
|
+
// Match: <TagName ...> or </TagName> or <TagName .../>
|
|
72
|
+
const tagPattern = /<(\/?)([A-Za-z][\w.]*)[^>]*?(\/?)>/g;
|
|
73
|
+
let m;
|
|
74
|
+
while ((m = tagPattern.exec(source)) !== null) {
|
|
75
|
+
const closing = m[1] === "/";
|
|
76
|
+
const selfClosing = m[3] === "/";
|
|
77
|
+
if (closing) {
|
|
78
|
+
if (depth > 0)
|
|
79
|
+
depth--;
|
|
80
|
+
}
|
|
81
|
+
else if (!selfClosing) {
|
|
82
|
+
depth++;
|
|
83
|
+
if (depth > maxDepth)
|
|
84
|
+
maxDepth = depth;
|
|
85
|
+
}
|
|
86
|
+
// self-closing: no change to depth
|
|
87
|
+
}
|
|
88
|
+
return maxDepth;
|
|
89
|
+
}
|
|
34
90
|
/**
|
|
35
91
|
* Estimate max nesting depth by tracking brace depth around control flow.
|
|
36
92
|
* Simple heuristic: count opening braces after control flow keywords.
|
|
@@ -73,10 +129,17 @@ export async function analyzeComplexity(repo, options) {
|
|
|
73
129
|
const minComplexity = options?.min_complexity ?? 1;
|
|
74
130
|
const includeTests = options?.include_tests ?? false;
|
|
75
131
|
const filePattern = options?.file_pattern;
|
|
132
|
+
// Build a language lookup for SQL file exclusion
|
|
133
|
+
const sqlFiles = new Set(index.files
|
|
134
|
+
.filter((f) => f.language === "sql" || f.language === "sql-jinja")
|
|
135
|
+
.map((f) => f.path));
|
|
76
136
|
// Filter to analyzable symbols
|
|
77
137
|
const symbols = index.symbols.filter((s) => {
|
|
78
138
|
if (!ANALYZABLE_KINDS.has(s.kind))
|
|
79
139
|
return false;
|
|
140
|
+
// Skip SQL files — cyclomatic complexity is meaningless for DDL
|
|
141
|
+
if (sqlFiles.has(s.file))
|
|
142
|
+
return false;
|
|
80
143
|
if (!s.source || s.source.length < 10)
|
|
81
144
|
return false;
|
|
82
145
|
if (!includeTests && isTestFile(s.file))
|
|
@@ -93,7 +156,7 @@ export async function analyzeComplexity(repo, options) {
|
|
|
93
156
|
const complexity = branches + 1;
|
|
94
157
|
const nesting = estimateMaxNesting(source);
|
|
95
158
|
if (complexity >= minComplexity) {
|
|
96
|
-
|
|
159
|
+
const info = {
|
|
97
160
|
name: sym.name,
|
|
98
161
|
kind: sym.kind,
|
|
99
162
|
file: sym.file,
|
|
@@ -103,7 +166,18 @@ export async function analyzeComplexity(repo, options) {
|
|
|
103
166
|
cyclomatic_complexity: complexity,
|
|
104
167
|
max_nesting_depth: nesting,
|
|
105
168
|
branches,
|
|
106
|
-
}
|
|
169
|
+
};
|
|
170
|
+
// React-specific metrics for components and hooks
|
|
171
|
+
if (sym.kind === "component" || sym.kind === "hook") {
|
|
172
|
+
const hooks = countReactHooks(source);
|
|
173
|
+
info.hook_count = hooks.total;
|
|
174
|
+
info.state_count = hooks.state;
|
|
175
|
+
info.effect_count = hooks.effect;
|
|
176
|
+
if (sym.kind === "component") {
|
|
177
|
+
info.jsx_depth = estimateJsxDepth(source);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
results.push(info);
|
|
107
181
|
}
|
|
108
182
|
}
|
|
109
183
|
// Sort by complexity descending
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"complexity-tools.js","sourceRoot":"","sources":["../../src/tools/complexity-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,gBAAgB,IAAI,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGvE,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAa;IAC3C,UAAU,EAAE,QAAQ,EAAE,OAAO;
|
|
1
|
+
{"version":3,"file":"complexity-tools.js","sourceRoot":"","sources":["../../src/tools/complexity-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export interface ComposeTreeNode {
|
|
2
|
+
name: string;
|
|
3
|
+
file: string;
|
|
4
|
+
start_line: number;
|
|
5
|
+
is_preview: boolean;
|
|
6
|
+
children: ComposeTreeNode[];
|
|
7
|
+
}
|
|
8
|
+
export interface ComposeTreeResult {
|
|
9
|
+
root: ComposeTreeNode;
|
|
10
|
+
total_components: number;
|
|
11
|
+
max_depth: number;
|
|
12
|
+
leaf_components: string[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Build the Compose component call tree rooted at `rootName`. Walks
|
|
16
|
+
* @Composable function bodies lexically to find PascalCase calls matching
|
|
17
|
+
* other indexed composables. @Preview composables are excluded from the
|
|
18
|
+
* tree since they're design-time only.
|
|
19
|
+
*
|
|
20
|
+
* Cycle-safe: visited set prevents infinite recursion on A→B→A patterns.
|
|
21
|
+
*/
|
|
22
|
+
export declare function traceComposeTree(repo: string, rootName: string, options?: {
|
|
23
|
+
depth?: number;
|
|
24
|
+
}): Promise<ComposeTreeResult>;
|
|
25
|
+
export interface RecompositionIssue {
|
|
26
|
+
component: string;
|
|
27
|
+
file: string;
|
|
28
|
+
start_line: number;
|
|
29
|
+
issue: string;
|
|
30
|
+
severity: "warning" | "critical";
|
|
31
|
+
param?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface RecompositionResult {
|
|
34
|
+
issues: RecompositionIssue[];
|
|
35
|
+
components_scanned: number;
|
|
36
|
+
components_with_issues: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Scan @Composable functions for recomposition hazards.
|
|
40
|
+
*
|
|
41
|
+
* Detects:
|
|
42
|
+
* 1. **Unstable lambda params** — function-type parameter without `remember`
|
|
43
|
+
* wrapper at call site; every recomposition allocates a new closure, causing
|
|
44
|
+
* the child to recompose even when nothing changed.
|
|
45
|
+
* 2. **Mutable collections** — `List<T>` / `MutableList<T>` / `Map<K,V>` /
|
|
46
|
+
* `Set<T>` params that aren't `@Stable` / `@Immutable` annotated; Compose
|
|
47
|
+
* can't skip recomposition because it can't prove the collection hasn't
|
|
48
|
+
* mutated between compositions.
|
|
49
|
+
* 3. **Missing remember for state allocation** — `mutableStateOf()` /
|
|
50
|
+
* `mutableStateListOf()` / `derivedStateOf()` called without a `remember`
|
|
51
|
+
* wrapper; the state resets on every recomposition, causing infinite loops
|
|
52
|
+
* or lost user input.
|
|
53
|
+
* 4. **Inline object allocation** — `object : ClickListener { }` or
|
|
54
|
+
* `SomeClass()` constructed inside composition body; creates new identity
|
|
55
|
+
* every frame.
|
|
56
|
+
*/
|
|
57
|
+
export declare function analyzeComposeRecomposition(repo: string, options?: {
|
|
58
|
+
file_pattern?: string;
|
|
59
|
+
}): Promise<RecompositionResult>;
|
|
60
|
+
//# sourceMappingURL=compose-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose-tools.d.ts","sourceRoot":"","sources":["../../src/tools/compose-tools.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,eAAe,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AA0BD;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3B,OAAO,CAAC,iBAAiB,CAAC,CA6E5B;AAMD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,SAAS,GAAG,UAAU,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAClC,OAAO,CAAC,mBAAmB,CAAC,CA+E9B"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jetpack Compose analysis tools.
|
|
3
|
+
*
|
|
4
|
+
* trace_compose_tree — build component hierarchy from @Composable calls
|
|
5
|
+
* analyze_compose_recomposition — detect unstable params causing unnecessary recompositions
|
|
6
|
+
*/
|
|
7
|
+
import { getCodeIndex } from "./index-tools.js";
|
|
8
|
+
/**
|
|
9
|
+
* Detect composable function calls inside a @Composable source body.
|
|
10
|
+
* Composable calls follow the PascalCase convention — we match any
|
|
11
|
+
* `UpperCaseName(` that corresponds to a known composable symbol.
|
|
12
|
+
*
|
|
13
|
+
* This is a lexical scan (not AST) for simplicity and speed. False
|
|
14
|
+
* positives from string literals or comments are unlikely in practice
|
|
15
|
+
* because PascalCase function calls are rare outside Compose.
|
|
16
|
+
*/
|
|
17
|
+
function findComposableCallees(source, composableNames) {
|
|
18
|
+
const callees = new Set();
|
|
19
|
+
// Match PascalCase identifier immediately followed by ( or (with space)
|
|
20
|
+
const callRe = /\b([A-Z][a-zA-Z0-9]+)\s*\(/g;
|
|
21
|
+
let m;
|
|
22
|
+
while ((m = callRe.exec(source)) !== null) {
|
|
23
|
+
const name = m[1];
|
|
24
|
+
if (composableNames.has(name))
|
|
25
|
+
callees.add(name);
|
|
26
|
+
}
|
|
27
|
+
return [...callees];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Build the Compose component call tree rooted at `rootName`. Walks
|
|
31
|
+
* @Composable function bodies lexically to find PascalCase calls matching
|
|
32
|
+
* other indexed composables. @Preview composables are excluded from the
|
|
33
|
+
* tree since they're design-time only.
|
|
34
|
+
*
|
|
35
|
+
* Cycle-safe: visited set prevents infinite recursion on A→B→A patterns.
|
|
36
|
+
*/
|
|
37
|
+
export async function traceComposeTree(repo, rootName, options) {
|
|
38
|
+
const index = await getCodeIndex(repo);
|
|
39
|
+
if (!index) {
|
|
40
|
+
throw new Error(`Repository "${repo}" not found. Index it first with index_folder.`);
|
|
41
|
+
}
|
|
42
|
+
const maxDepth = options?.depth ?? 10;
|
|
43
|
+
// Index all composables by name (excluding @Preview).
|
|
44
|
+
const composablesByName = new Map();
|
|
45
|
+
const composableNames = new Set();
|
|
46
|
+
for (const sym of index.symbols) {
|
|
47
|
+
if (sym.kind !== "component")
|
|
48
|
+
continue;
|
|
49
|
+
if (sym.meta?.["compose_preview"])
|
|
50
|
+
continue;
|
|
51
|
+
if (!composablesByName.has(sym.name)) {
|
|
52
|
+
composablesByName.set(sym.name, sym);
|
|
53
|
+
}
|
|
54
|
+
composableNames.add(sym.name);
|
|
55
|
+
}
|
|
56
|
+
const root = composablesByName.get(rootName);
|
|
57
|
+
if (!root) {
|
|
58
|
+
throw new Error(`"${rootName}" is not a @Composable function. Ensure the file is indexed and the function has the @Composable annotation.`);
|
|
59
|
+
}
|
|
60
|
+
const visited = new Set();
|
|
61
|
+
const allVisited = new Set();
|
|
62
|
+
const leafComponents = [];
|
|
63
|
+
function buildNode(sym, depth) {
|
|
64
|
+
allVisited.add(sym.name);
|
|
65
|
+
const node = {
|
|
66
|
+
name: sym.name,
|
|
67
|
+
file: sym.file,
|
|
68
|
+
start_line: sym.start_line,
|
|
69
|
+
is_preview: !!sym.meta?.["compose_preview"],
|
|
70
|
+
children: [],
|
|
71
|
+
};
|
|
72
|
+
if (depth >= maxDepth || visited.has(sym.id))
|
|
73
|
+
return node;
|
|
74
|
+
visited.add(sym.id);
|
|
75
|
+
const source = sym.source ?? "";
|
|
76
|
+
const callees = findComposableCallees(source, composableNames);
|
|
77
|
+
for (const calleeName of callees) {
|
|
78
|
+
if (calleeName === sym.name)
|
|
79
|
+
continue; // skip self-reference
|
|
80
|
+
const calleeSym = composablesByName.get(calleeName);
|
|
81
|
+
if (!calleeSym)
|
|
82
|
+
continue;
|
|
83
|
+
if (visited.has(calleeSym.id))
|
|
84
|
+
continue; // cycle protection
|
|
85
|
+
node.children.push(buildNode(calleeSym, depth + 1));
|
|
86
|
+
}
|
|
87
|
+
if (node.children.length === 0 && depth > 0) {
|
|
88
|
+
leafComponents.push(sym.name);
|
|
89
|
+
}
|
|
90
|
+
visited.delete(sym.id); // allow revisit from different parent (DAG, not tree)
|
|
91
|
+
return node;
|
|
92
|
+
}
|
|
93
|
+
const rootNode = buildNode(root, 0);
|
|
94
|
+
// Compute max depth.
|
|
95
|
+
function getDepth(n) {
|
|
96
|
+
if (n.children.length === 0)
|
|
97
|
+
return 0;
|
|
98
|
+
return 1 + Math.max(...n.children.map(getDepth));
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
root: rootNode,
|
|
102
|
+
total_components: allVisited.size,
|
|
103
|
+
max_depth: getDepth(rootNode),
|
|
104
|
+
leaf_components: [...new Set(leafComponents)].sort(),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Scan @Composable functions for recomposition hazards.
|
|
109
|
+
*
|
|
110
|
+
* Detects:
|
|
111
|
+
* 1. **Unstable lambda params** — function-type parameter without `remember`
|
|
112
|
+
* wrapper at call site; every recomposition allocates a new closure, causing
|
|
113
|
+
* the child to recompose even when nothing changed.
|
|
114
|
+
* 2. **Mutable collections** — `List<T>` / `MutableList<T>` / `Map<K,V>` /
|
|
115
|
+
* `Set<T>` params that aren't `@Stable` / `@Immutable` annotated; Compose
|
|
116
|
+
* can't skip recomposition because it can't prove the collection hasn't
|
|
117
|
+
* mutated between compositions.
|
|
118
|
+
* 3. **Missing remember for state allocation** — `mutableStateOf()` /
|
|
119
|
+
* `mutableStateListOf()` / `derivedStateOf()` called without a `remember`
|
|
120
|
+
* wrapper; the state resets on every recomposition, causing infinite loops
|
|
121
|
+
* or lost user input.
|
|
122
|
+
* 4. **Inline object allocation** — `object : ClickListener { }` or
|
|
123
|
+
* `SomeClass()` constructed inside composition body; creates new identity
|
|
124
|
+
* every frame.
|
|
125
|
+
*/
|
|
126
|
+
export async function analyzeComposeRecomposition(repo, options) {
|
|
127
|
+
const index = await getCodeIndex(repo);
|
|
128
|
+
if (!index) {
|
|
129
|
+
throw new Error(`Repository "${repo}" not found. Index it first with index_folder.`);
|
|
130
|
+
}
|
|
131
|
+
const issues = [];
|
|
132
|
+
let scanned = 0;
|
|
133
|
+
const withIssues = new Set();
|
|
134
|
+
for (const sym of index.symbols) {
|
|
135
|
+
if (sym.kind !== "component")
|
|
136
|
+
continue;
|
|
137
|
+
if (sym.meta?.["compose_preview"])
|
|
138
|
+
continue;
|
|
139
|
+
if (options?.file_pattern && !sym.file.includes(options.file_pattern))
|
|
140
|
+
continue;
|
|
141
|
+
scanned++;
|
|
142
|
+
const source = sym.source ?? "";
|
|
143
|
+
// Issue 1: missing `remember` around state allocation.
|
|
144
|
+
const stateAllocRe = /\b(mutableStateOf|mutableStateListOf|mutableIntStateOf|mutableFloatStateOf|mutableDoubleStateOf|mutableLongStateOf|derivedStateOf)\s*[<(]/g;
|
|
145
|
+
let m;
|
|
146
|
+
while ((m = stateAllocRe.exec(source)) !== null) {
|
|
147
|
+
// Check if `remember` appears in the ~80 chars before this match.
|
|
148
|
+
const preceding = source.slice(Math.max(0, m.index - 80), m.index);
|
|
149
|
+
if (!/\bremember\b/.test(preceding)) {
|
|
150
|
+
const lineOffset = source.slice(0, m.index).split("\n").length - 1;
|
|
151
|
+
issues.push({
|
|
152
|
+
component: sym.name,
|
|
153
|
+
file: sym.file,
|
|
154
|
+
start_line: sym.start_line + lineOffset,
|
|
155
|
+
issue: `${m[1]} without remember {} wrapper — state resets every recomposition`,
|
|
156
|
+
severity: "critical",
|
|
157
|
+
});
|
|
158
|
+
withIssues.add(sym.name);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Issue 2: unstable collection params.
|
|
162
|
+
const sig = sym.signature ?? "";
|
|
163
|
+
const collectionParamRe = /(\w+)\s*:\s*((?:Mutable)?(?:List|Map|Set|ArrayList|HashMap|HashSet))\s*[<,)]/g;
|
|
164
|
+
while ((m = collectionParamRe.exec(sig)) !== null) {
|
|
165
|
+
const issueEntry = {
|
|
166
|
+
component: sym.name,
|
|
167
|
+
file: sym.file,
|
|
168
|
+
start_line: sym.start_line,
|
|
169
|
+
issue: `Parameter "${m[1]}" is ${m[2]}<...> — unstable collection type; Compose can't skip recomposition. Use kotlinx.collections.immutable or wrap in @Stable/@Immutable.`,
|
|
170
|
+
severity: "warning",
|
|
171
|
+
};
|
|
172
|
+
if (m[1] != null)
|
|
173
|
+
issueEntry.param = m[1];
|
|
174
|
+
issues.push(issueEntry);
|
|
175
|
+
withIssues.add(sym.name);
|
|
176
|
+
}
|
|
177
|
+
// Issue 3: function-type params likely passed as unstable lambda at call sites.
|
|
178
|
+
// Detect `() -> Unit` / `(T) -> Unit` style params — these are guaranteed
|
|
179
|
+
// unstable unless caller wraps them in remember.
|
|
180
|
+
const lambdaParamRe = /(\w+)\s*:\s*(?:\([^)]*\)\s*->\s*\w+)/g;
|
|
181
|
+
let lambdaParamCount = 0;
|
|
182
|
+
while ((m = lambdaParamRe.exec(sig)) !== null) {
|
|
183
|
+
lambdaParamCount++;
|
|
184
|
+
}
|
|
185
|
+
// Only warn when there are many lambda params — 1-2 is standard (onClick, etc.)
|
|
186
|
+
if (lambdaParamCount > 3) {
|
|
187
|
+
issues.push({
|
|
188
|
+
component: sym.name,
|
|
189
|
+
file: sym.file,
|
|
190
|
+
start_line: sym.start_line,
|
|
191
|
+
issue: `${lambdaParamCount} function-type parameters — each one causes recomposition unless caller wraps in remember. Consider extracting state hoisting pattern.`,
|
|
192
|
+
severity: "warning",
|
|
193
|
+
});
|
|
194
|
+
withIssues.add(sym.name);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
issues,
|
|
199
|
+
components_scanned: scanned,
|
|
200
|
+
components_with_issues: withIssues.size,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=compose-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose-tools.js","sourceRoot":"","sources":["../../src/tools/compose-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export interface FanMetric {
|
|
2
|
+
file: string;
|
|
3
|
+
count: number;
|
|
4
|
+
connections: string[];
|
|
5
|
+
}
|
|
6
|
+
export interface FanInFanOutResult {
|
|
7
|
+
fan_in_top: FanMetric[];
|
|
8
|
+
fan_out_top: FanMetric[];
|
|
9
|
+
hub_files: FanMetric[];
|
|
10
|
+
coupling_score: number;
|
|
11
|
+
total_files: number;
|
|
12
|
+
total_edges: number;
|
|
13
|
+
}
|
|
14
|
+
export interface CoChangePair {
|
|
15
|
+
file_a: string;
|
|
16
|
+
file_b: string;
|
|
17
|
+
co_commits: number;
|
|
18
|
+
jaccard: number;
|
|
19
|
+
support_a: number;
|
|
20
|
+
support_b: number;
|
|
21
|
+
}
|
|
22
|
+
export interface CoChangeResult {
|
|
23
|
+
pairs: CoChangePair[];
|
|
24
|
+
clusters: string[][];
|
|
25
|
+
total_commits_analyzed: number;
|
|
26
|
+
period: string;
|
|
27
|
+
}
|
|
28
|
+
export declare function fanInFanOut(repo: string, options?: {
|
|
29
|
+
path?: string;
|
|
30
|
+
top_n?: number;
|
|
31
|
+
level?: "file";
|
|
32
|
+
min_fan_in?: number;
|
|
33
|
+
min_fan_out?: number;
|
|
34
|
+
}): Promise<FanInFanOutResult>;
|
|
35
|
+
export declare function computeCoChangePairs(repoRoot: string, options?: {
|
|
36
|
+
since_days?: number;
|
|
37
|
+
min_support?: number;
|
|
38
|
+
max_files_per_commit?: number;
|
|
39
|
+
}): {
|
|
40
|
+
pairs: CoChangePair[];
|
|
41
|
+
total_commits: number;
|
|
42
|
+
};
|
|
43
|
+
export declare function coChangeAnalysis(repo: string, options?: {
|
|
44
|
+
since_days?: number;
|
|
45
|
+
min_support?: number;
|
|
46
|
+
min_jaccard?: number;
|
|
47
|
+
path?: string;
|
|
48
|
+
top_n?: number;
|
|
49
|
+
}): Promise<CoChangeResult>;
|
|
50
|
+
//# sourceMappingURL=coupling-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coupling-tools.d.ts","sourceRoot":"","sources":["../../src/tools/coupling-tools.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,WAAW,EAAE,SAAS,EAAE,CAAC;IACzB,SAAS,EAAE,SAAS,EAAE,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAMD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC;IACrB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GACA,OAAO,CAAC,iBAAiB,CAAC,CAiG5B;AAUD,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,GACA;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAsGlD;AAMD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,cAAc,CAAC,CAqCzB"}
|