codesift-mcp 0.3.0 → 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 +33 -5
- package/rules/codesift.mdc +33 -5
- package/rules/codex.md +33 -5
- package/rules/gemini.md +33 -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,11 +1,178 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
1
3
|
import { getCodeIndex } from "./index-tools.js";
|
|
2
4
|
import { isTestFileStrict as isTestFile } from "../utils/test-file.js";
|
|
3
5
|
// Built-in patterns inspired by CQ checklist + common React/TS anti-patterns
|
|
4
|
-
|
|
6
|
+
// Exported for direct regex testing in unit tests.
|
|
7
|
+
export const BUILTIN_PATTERNS = {
|
|
5
8
|
"useEffect-no-cleanup": {
|
|
6
9
|
regex: /useEffect\s*\(\s*(?:async\s*)?\(\)\s*=>\s*\{(?:(?!return\s*\(\s*\)\s*=>|return\s+\(\)\s*=>|return\s*\(\s*\)\s*\{|return\s+function)[\s\S])*\}\s*,/,
|
|
7
10
|
description: "useEffect without cleanup return — potential memory leak (CQ22)",
|
|
8
11
|
},
|
|
12
|
+
// --- React anti-patterns (Wave 2) ---
|
|
13
|
+
"hook-in-condition": {
|
|
14
|
+
regex: /\b(?:if|for|while|switch)\s*\([^)]*\)\s*\{[\s\S]{0,500}?\buse[A-Z]\w*\s*\(/,
|
|
15
|
+
description: "React hook called inside if/for/while/switch — violates Rule of Hooks",
|
|
16
|
+
},
|
|
17
|
+
"useEffect-async": {
|
|
18
|
+
regex: /useEffect\s*\(\s*async\s+(?:function\b|\(|[a-z_$])/,
|
|
19
|
+
description: "async function directly in useEffect — use inner async wrapper (CQ22)",
|
|
20
|
+
},
|
|
21
|
+
"useEffect-object-dep": {
|
|
22
|
+
regex: /useEffect\s*\([\s\S]*?,\s*\[[^\]]*[{[]/,
|
|
23
|
+
description: "Object/array literal in useEffect dependency array — causes infinite re-renders",
|
|
24
|
+
},
|
|
25
|
+
"missing-display-name": {
|
|
26
|
+
regex: /(?:React\.)?(?:memo|forwardRef)\s*\((?:(?!displayName)[\s\S]){0,500}$/,
|
|
27
|
+
description: "React.memo/forwardRef without displayName nearby — harder to debug in DevTools",
|
|
28
|
+
},
|
|
29
|
+
"index-as-key": {
|
|
30
|
+
regex: /\.map\s*\(\s*\(\s*\w+\s*,\s*(index|idx|i)\b[^)]*\)\s*=>[\s\S]{0,400}?key\s*=\s*\{?\s*\1\b/,
|
|
31
|
+
description: "Array index used as React key — causes incorrect reconciliation on reorder",
|
|
32
|
+
},
|
|
33
|
+
"inline-handler": {
|
|
34
|
+
regex: /\bon[A-Z]\w*\s*=\s*\{\s*(?:\([^)]*\)|[a-z_$][\w$]*)\s*=>/,
|
|
35
|
+
description: "Inline arrow function in JSX event handler — creates new reference every render (memoization killer)",
|
|
36
|
+
},
|
|
37
|
+
"conditional-render-hook": {
|
|
38
|
+
regex: /\breturn\s+[^;{]*;\s*\n[\s\S]*?\buse[A-Z]\w*\s*\(/,
|
|
39
|
+
description: "React hook called after early return — violates Rule of Hooks",
|
|
40
|
+
},
|
|
41
|
+
// --- React anti-patterns (Wave 4b — additional) ---
|
|
42
|
+
"dangerously-set-html": {
|
|
43
|
+
regex: /dangerouslySetInnerHTML\s*=\s*\{/,
|
|
44
|
+
description: "dangerouslySetInnerHTML used — XSS risk unless content is sanitized (CQ24)",
|
|
45
|
+
},
|
|
46
|
+
"direct-dom-access": {
|
|
47
|
+
regex: /\bdocument\.(getElementById|querySelector|querySelectorAll|getElementsBy)\s*\(/,
|
|
48
|
+
description: "Direct DOM access in React component — use useRef instead (breaks SSR, bypasses virtual DOM)",
|
|
49
|
+
},
|
|
50
|
+
"unstable-default-value": {
|
|
51
|
+
regex: /(?:function\s+[A-Z]\w*|const\s+[A-Z]\w*\s*=\s*(?:\([^)]*\)|[^=]*)\s*=>)\s*[\s\S]{0,100}(?:\{\s*[^}]*=\s*\[\s*\]|\{\s*[^}]*=\s*\{\s*\})/,
|
|
52
|
+
description: "Default prop value [] or {} in component params — creates new reference every render, breaks memo/PureComponent",
|
|
53
|
+
},
|
|
54
|
+
"jsx-falsy-and": {
|
|
55
|
+
regex: /\{\s*(?:count|length|size|num|total|amount)\s*&&\s*</,
|
|
56
|
+
description: "Numeric variable used with && in JSX — renders '0' on screen when falsy. Use ternary or Boolean() (React gotcha)",
|
|
57
|
+
},
|
|
58
|
+
"nested-component-def": {
|
|
59
|
+
regex: /(?:function\s+[A-Z]\w*\s*\([^)]*\)\s*\{|const\s+[A-Z]\w*\s*=\s*(?:\([^)]*\)|[\w$]*)\s*=>\s*\{)[\s\S]{0,1500}?\n\s{2,}(?:function\s+[A-Z]\w*\s*\(|const\s+[A-Z]\w*\s*=\s*\()/,
|
|
60
|
+
description: "Component defined inside another component — remounts on every parent render, loses all state. Hoist to module level.",
|
|
61
|
+
},
|
|
62
|
+
"usecallback-no-deps": {
|
|
63
|
+
regex: /use(?:Callback|Memo)\s*\([\s\S]*?\)\s*\)\s*[;,]/,
|
|
64
|
+
description: "useCallback/useMemo with only one argument (no dependency array) — useless memoization, value recreated every render",
|
|
65
|
+
},
|
|
66
|
+
// --- React 19 features (Tier 4 — Item 19) ---
|
|
67
|
+
"react19-use-without-suspense": {
|
|
68
|
+
regex: /\buse\s*\(\s*[a-zA-Z_$][\w$]*\s*\)/,
|
|
69
|
+
description: "React 19 use(promise) — must be wrapped in <Suspense> or it throws. Verify Suspense boundary exists in parent.",
|
|
70
|
+
fileIncludePattern: /\.(tsx|jsx)$/,
|
|
71
|
+
},
|
|
72
|
+
"react19-server-action-not-async": {
|
|
73
|
+
regex: /^[\s\S]{0,200}["']use server["'][\s\S]{0,500}?\bexport\s+(?!async)function\s+\w+\s*\(/m,
|
|
74
|
+
description: "React 19 Server Action: function in 'use server' file must be async (returns Promise). Synchronous functions break the action contract.",
|
|
75
|
+
fileIncludePattern: /\.(tsx|jsx|ts|js)$/,
|
|
76
|
+
},
|
|
77
|
+
"react19-form-action-non-function": {
|
|
78
|
+
regex: /<form\s+[^>]*\baction\s*=\s*["'][^"']/,
|
|
79
|
+
description: "React 19 form action prop should be a function (Server Action), not a string URL. Use <form action={serverAction}> for progressive enhancement.",
|
|
80
|
+
fileIncludePattern: /\.(tsx|jsx)$/,
|
|
81
|
+
},
|
|
82
|
+
"react19-useoptimistic-no-transition": {
|
|
83
|
+
regex: /\buseOptimistic\s*\([\s\S]{0,300}?(?!useTransition|startTransition)/,
|
|
84
|
+
description: "React 19 useOptimistic should be paired with useTransition/startTransition for non-urgent updates. Without it, optimistic updates can be interrupted.",
|
|
85
|
+
fileIncludePattern: /\.(tsx|jsx)$/,
|
|
86
|
+
},
|
|
87
|
+
// --- oxlint-inspired React rules (April 2026) ---
|
|
88
|
+
"hook-usestate-destructure": {
|
|
89
|
+
regex: /(?:^|\n)\s*useState\s*(?:<[^>]+>)?\s*\([^)]*\)\s*;/,
|
|
90
|
+
description: "useState() called without destructuring [value, setter] — value is inaccessible. Use: const [value, setValue] = useState(initial). (oxlint react/hook-use-state)",
|
|
91
|
+
fileIncludePattern: /\.(tsx|jsx|ts)$/,
|
|
92
|
+
},
|
|
93
|
+
"prefer-function-component": {
|
|
94
|
+
regex: /class\s+\w+\s+extends\s+(?:React\.)?(?:Component|PureComponent)\b/,
|
|
95
|
+
description: "Class component could be a function component — class components lack hook support, are harder to tree-shake, and React Compiler cannot optimize them. (oxlint react/prefer-function-component)",
|
|
96
|
+
fileIncludePattern: /\.(tsx|jsx)$/,
|
|
97
|
+
},
|
|
98
|
+
// --- React Compiler bailout patterns (GA v1.0, Oct 2025 — Next.js 16 stable) ---
|
|
99
|
+
"compiler-side-effect-in-render": {
|
|
100
|
+
regex: /\b(?:console\.(?:log|warn|error|info)\s*\(|Math\.random\s*\(|Date\.now\s*\(|document\.(?:getElementById|querySelector|createElement)\s*\()/,
|
|
101
|
+
description: "Side effect in render body — React Compiler silently skips memoization. Move to useEffect or event handler.",
|
|
102
|
+
fileIncludePattern: /\.(tsx|jsx)$/,
|
|
103
|
+
},
|
|
104
|
+
"compiler-ref-read-in-render": {
|
|
105
|
+
regex: /(?:^|\n)\s*(?:const|let|var)\s+\w+\s*=\s*\w+Ref\.current\b/,
|
|
106
|
+
description: "Reading ref.current during render — React Compiler cannot track ref mutations. Read refs in useEffect or event handlers only.",
|
|
107
|
+
fileIncludePattern: /\.(tsx|jsx)$/,
|
|
108
|
+
},
|
|
109
|
+
"compiler-prop-mutation": {
|
|
110
|
+
regex: /\bprops\.\w+\.(?:push|pop|shift|unshift|splice|sort|reverse|fill)\s*\(/,
|
|
111
|
+
description: "Mutating props object — breaks React Compiler immutability assumption. Clone before mutating: [...props.items, newItem].",
|
|
112
|
+
fileIncludePattern: /\.(tsx|jsx)$/,
|
|
113
|
+
},
|
|
114
|
+
"compiler-state-mutation": {
|
|
115
|
+
regex: /(?:^|\n)\s*\w+\.(?:push|pop|shift|unshift|splice|sort|reverse|fill)\s*\([\s\S]{0,200}?set[A-Z]\w*\s*\(\s*\w+\s*\)/,
|
|
116
|
+
description: "Direct state mutation then setState with same reference — React Compiler assumes immutable updates. Use spread: setItems([...items, newItem]).",
|
|
117
|
+
fileIncludePattern: /\.(tsx|jsx)$/,
|
|
118
|
+
},
|
|
119
|
+
"compiler-try-catch-bailout": {
|
|
120
|
+
regex: /(?:function\s+[A-Z]\w*|const\s+[A-Z]\w*\s*=)[\s\S]{0,300}?\btry\s*\{[\s\S]{0,500}?\bcatch\s*\(/,
|
|
121
|
+
description: "try/catch in component body — React Compiler may silently bail out (known issue #35644). Move error handling to useEffect or extract to a hook.",
|
|
122
|
+
fileIncludePattern: /\.(tsx|jsx)$/,
|
|
123
|
+
},
|
|
124
|
+
"compiler-redundant-memo": {
|
|
125
|
+
regex: /\b(?:React\.)?memo\s*\(\s*(?:function\s+[A-Z]|(?:\([^)]*\)|[A-Z]\w*)\s*=>)/,
|
|
126
|
+
description: "React.memo wrapping — React Compiler auto-memoizes, making manual memo redundant. Safe to remove after compiler adoption.",
|
|
127
|
+
fileIncludePattern: /\.(tsx|jsx)$/,
|
|
128
|
+
},
|
|
129
|
+
"compiler-redundant-usecallback": {
|
|
130
|
+
regex: /\buseCallback\s*\(\s*(?:\([^)]*\)|[a-z_$][\w$]*)\s*=>/,
|
|
131
|
+
description: "useCallback wrapping — React Compiler auto-memoizes callbacks, making manual useCallback redundant. Safe to remove after compiler adoption.",
|
|
132
|
+
fileIncludePattern: /\.(tsx|jsx)$/,
|
|
133
|
+
},
|
|
134
|
+
// --- RSC boundary serializability (Tier 4 — Item 18) ---
|
|
135
|
+
"rsc-non-serializable-prop": {
|
|
136
|
+
// Detects patterns like onClick={fn} or callback={handler} on JSX elements
|
|
137
|
+
// when the file has "use client" directive or imports from a client component.
|
|
138
|
+
// Heuristic: prop=function-reference (not arrow inline, that's caught elsewhere).
|
|
139
|
+
regex: /\b(?:onClick|onChange|onSubmit|onError|callback|handler|render)\s*=\s*\{\s*[a-z_$][\w$]*\s*\}/,
|
|
140
|
+
description: "Function passed as prop across RSC boundary — must be a Server Action ('use server') or component must be Client Component ('use client'). Functions are not serializable.",
|
|
141
|
+
fileIncludePattern: /\.(tsx|jsx)$/,
|
|
142
|
+
},
|
|
143
|
+
"rsc-date-prop": {
|
|
144
|
+
regex: /\b\w+\s*=\s*\{\s*new\s+Date\s*\(/,
|
|
145
|
+
description: "Date object passed as prop — Date is serializable in JSON but loses prototype across RSC boundary. Use ISO string + parse on client side.",
|
|
146
|
+
fileIncludePattern: /\.(tsx|jsx)$/,
|
|
147
|
+
},
|
|
148
|
+
// --- useEffect pain points (37% of devs struggle — State of React 2025) ---
|
|
149
|
+
"useEffect-missing-cleanup": {
|
|
150
|
+
regex: /useEffect\s*\(\s*(?:\([^)]*\)|[a-z_$][\w$]*)\s*=>[\s\S]{0,800}?(?:addEventListener|setInterval|setTimeout|subscribe|on\s*\()(?:(?!return\s*(?:\(\s*\)\s*=>|function))[\s\S]){0,800}\}\s*,/,
|
|
151
|
+
description: "useEffect with addEventListener/setInterval/subscribe but no cleanup return — memory leak. Return a cleanup function that removes the listener/clears the interval.",
|
|
152
|
+
fileIncludePattern: /\.(tsx|jsx)$/,
|
|
153
|
+
},
|
|
154
|
+
"useEffect-setstate-loop": {
|
|
155
|
+
regex: /useEffect\s*\(\s*(?:\([^)]*\)|[a-z_$][\w$]*)\s*=>[\s\S]{0,500}?set([A-Z]\w*)\s*\([\s\S]{0,300}?\[\s*[\s\S]*?\b\1\b/i,
|
|
156
|
+
description: "setState inside useEffect with same state variable in dependency array — causes infinite render loop. Either remove from deps or use functional updater: setState(prev => ...).",
|
|
157
|
+
fileIncludePattern: /\.(tsx|jsx)$/,
|
|
158
|
+
},
|
|
159
|
+
// --- Next.js 16 cache patterns ---
|
|
160
|
+
"nextjs-use-cache-without-tag": {
|
|
161
|
+
regex: /['"]use cache['"](?:(?!cacheTag\s*\()[\s\S]){0,1000}$/,
|
|
162
|
+
description: "Next.js 16 'use cache' directive without cacheTag() call — cache entry is hard to invalidate. Add cacheTag('name') for targeted revalidation.",
|
|
163
|
+
fileIncludePattern: /\.(tsx|jsx|ts)$/,
|
|
164
|
+
},
|
|
165
|
+
"nextjs-revalidatetag-deprecated": {
|
|
166
|
+
regex: /\brevalidateTag\s*\(\s*['"][^'"]+['"]\s*\)/,
|
|
167
|
+
description: "Next.js 16: revalidateTag() without cacheLife profile (second argument). Single-arg form deprecated — add cacheLife profile.",
|
|
168
|
+
fileIncludePattern: /\.(tsx|jsx|ts)$/,
|
|
169
|
+
},
|
|
170
|
+
// --- TanStack Query patterns ---
|
|
171
|
+
"tanstack-missing-invalidation": {
|
|
172
|
+
regex: /\buseMutation\s*\((?:(?!invalidateQueries|invalidateQuery)[\s\S]){0,800}\}\s*\)/,
|
|
173
|
+
description: "useMutation without invalidateQueries in onSuccess/onSettled — stale data remains in cache after mutation. Add queryClient.invalidateQueries() on success.",
|
|
174
|
+
fileIncludePattern: /\.(tsx|jsx|ts)$/,
|
|
175
|
+
},
|
|
9
176
|
"empty-catch": {
|
|
10
177
|
regex: /catch\s*\([^)]*\)\s*\{\s*\}/,
|
|
11
178
|
description: "Empty catch block — swallowed error (CQ8)",
|
|
@@ -38,6 +205,346 @@ const BUILTIN_PATTERNS = {
|
|
|
38
205
|
regex: /\/\/\s*(TODO|FIXME|HACK|XXX|TEMP|TEMPORARY)\b|\/\/\s*(Phase|Step|Stage)\s*\d|\/\/\s*(placeholder|stub|dummy)\b|throw new Error\(['"]not implemented['"]\)|console\.(log|warn)\(['"]TODO\b/i,
|
|
39
206
|
description: "Scaffolding markers: TODO/FIXME/HACK, Phase/Step markers, placeholder stubs, not-implemented throws (tech debt)",
|
|
40
207
|
},
|
|
208
|
+
// Kotlin anti-patterns
|
|
209
|
+
"runblocking-in-coroutine": {
|
|
210
|
+
regex: /suspend\s+fun[\s\S]{0,500}runBlocking\s*[\({]/,
|
|
211
|
+
description: "runBlocking inside suspend function — deadlock risk (Kotlin coroutines)",
|
|
212
|
+
},
|
|
213
|
+
"globalscope-launch": {
|
|
214
|
+
regex: /GlobalScope\.(launch|async)\s*[\({]/,
|
|
215
|
+
description: "GlobalScope.launch/async — lifecycle leak, use structured concurrency (Kotlin)",
|
|
216
|
+
},
|
|
217
|
+
"data-class-mutable": {
|
|
218
|
+
regex: /data\s+class\s+\w+\([^)]*\bvar\s+/,
|
|
219
|
+
description: "data class with var property — breaks hashCode/equals contract (Kotlin)",
|
|
220
|
+
},
|
|
221
|
+
"lateinit-no-check": {
|
|
222
|
+
regex: /lateinit\s+var\s+(\w+)/,
|
|
223
|
+
description: "lateinit var without isInitialized check — UninitializedPropertyAccessException risk (Kotlin)",
|
|
224
|
+
},
|
|
225
|
+
"empty-when-branch": {
|
|
226
|
+
regex: /when\s*\([^)]*\)\s*\{[\s\S]*?->\s*\{\s*\}/,
|
|
227
|
+
description: "Empty when branch — swallowed case (Kotlin)",
|
|
228
|
+
},
|
|
229
|
+
"mutable-shared-state": {
|
|
230
|
+
regex: /(?:companion\s+object|object\s+\w+)\s*\{[\s\S]*?\bvar\s+/,
|
|
231
|
+
description: "Mutable var inside object/companion — thread-unsafe shared state (Kotlin)",
|
|
232
|
+
},
|
|
233
|
+
// Kotest anti-patterns — require include_tests=true to surface
|
|
234
|
+
"kotest-missing-assertion": {
|
|
235
|
+
regex: /\btest\s*\(\s*"[^"]*"\s*\)\s*\{(?:(?!\bshould(?:Be|NotBe|Throw|Contain|Match|HaveSize)\b|\bshould\s*\{|\bshouldBe\b|\bassertSoftly\b|\bassertThat\b|\bassertTrue\b|\bassertFalse\b|\bassertEquals\b|\bexpect\s*\(|\bverify\s*\()[\s\S])*?\}/,
|
|
236
|
+
description: "Kotest test block without any shouldBe/shouldThrow/assertSoftly/assertEquals — missing assertion",
|
|
237
|
+
},
|
|
238
|
+
"kotest-mixed-styles": {
|
|
239
|
+
regex: /(?:\bFunSpec\s*\([\s\S]*?(?:\bDescribeSpec|\bStringSpec|\bBehaviorSpec|\bShouldSpec|\bWordSpec|\bFeatureSpec|\bExpectSpec)\s*\()|(?:(?:\bDescribeSpec|\bStringSpec|\bBehaviorSpec|\bShouldSpec|\bWordSpec|\bFeatureSpec|\bExpectSpec)\s*\([\s\S]*?\bFunSpec\s*\()/,
|
|
240
|
+
description: "Multiple Kotest spec styles (e.g. FunSpec + DescribeSpec) in same file — inconsistent test layout",
|
|
241
|
+
},
|
|
242
|
+
// Jetpack Compose anti-patterns
|
|
243
|
+
"compose-missing-remember": {
|
|
244
|
+
regex: /(?<!\bremember\s*\{[^}]{0,60})\b(?:mutableStateOf|mutableStateListOf|mutableIntStateOf|derivedStateOf)\s*(?:<[^>]*>)?\s*\(/,
|
|
245
|
+
description: "mutableStateOf/derivedStateOf without remember — state resets every recomposition (Compose)",
|
|
246
|
+
},
|
|
247
|
+
"compose-unstable-lambda": {
|
|
248
|
+
regex: /@Composable[\s\S]{0,2000}?\bon[A-Z]\w*\s*:\s*\([^)]*\)\s*->\s*Unit/,
|
|
249
|
+
description: "Event callback param with function type — unstable, causes child recomposition every frame unless caller uses remember (Compose)",
|
|
250
|
+
},
|
|
251
|
+
"compose-side-effect-in-composition": {
|
|
252
|
+
regex: /@Composable[\s\S]{0,1000}?(?:\bcoroutineScope\s*\{|\bviewModelScope\.launch|\bGlobalScope\.launch)/,
|
|
253
|
+
description: "Coroutine launch in @Composable body — use LaunchedEffect/rememberCoroutineScope instead (Compose)",
|
|
254
|
+
},
|
|
255
|
+
// PHP anti-patterns
|
|
256
|
+
"sql-injection-php": {
|
|
257
|
+
regex: /\$_(?:GET|POST|REQUEST)\[[^\]]+\][\s\S]{0,200}?(?:->query\(|->execute\(|createCommand\()/,
|
|
258
|
+
description: "User input from $_GET/$_POST flowing into SQL query without sanitization (PHP)",
|
|
259
|
+
},
|
|
260
|
+
"xss-php": {
|
|
261
|
+
regex: /echo\s+\$_(?:GET|POST|REQUEST)\[|print\s+\$_(?:GET|POST|REQUEST)\[/,
|
|
262
|
+
description: "Unescaped user input echoed to output — XSS risk (PHP). Use htmlspecialchars()",
|
|
263
|
+
},
|
|
264
|
+
"eval-php": {
|
|
265
|
+
regex: /\beval\s*\(/,
|
|
266
|
+
description: "eval() usage — code injection risk (PHP)",
|
|
267
|
+
},
|
|
268
|
+
"exec-php": {
|
|
269
|
+
regex: /\b(?:exec|system|passthru|shell_exec|popen|proc_open)\s*\(/,
|
|
270
|
+
description: "Shell command execution — command injection risk (PHP)",
|
|
271
|
+
},
|
|
272
|
+
"unserialize-php": {
|
|
273
|
+
regex: /\bunserialize\s*\(\s*\$_(?:GET|POST|REQUEST|COOKIE)/,
|
|
274
|
+
description: "unserialize() on user input — deserialization attack risk (PHP)",
|
|
275
|
+
},
|
|
276
|
+
"file-include-var": {
|
|
277
|
+
regex: /(?:require|include)(?:_once)?\s*\(?\s*\$(?!this)/,
|
|
278
|
+
description: "require/include with variable — file inclusion risk (PHP)",
|
|
279
|
+
},
|
|
280
|
+
"unescaped-yii-view": {
|
|
281
|
+
regex: /<\?=\s*\$(?!this->(?:render|beginBlock|endBlock))(?!.*?Html::encode)/,
|
|
282
|
+
description: "Yii2 view outputs variable without Html::encode() — XSS risk",
|
|
283
|
+
},
|
|
284
|
+
"raw-query-yii": {
|
|
285
|
+
regex: /createCommand\s*\(\s*["'][^"']*\$\{?\w+/,
|
|
286
|
+
description: "Yii2 createCommand with string interpolation — SQL injection risk",
|
|
287
|
+
},
|
|
288
|
+
// NestJS anti-patterns
|
|
289
|
+
"nest-circular-inject": {
|
|
290
|
+
regex: /@Inject\s*\(\s*forwardRef\s*\(/,
|
|
291
|
+
description: "Circular dependency via forwardRef — restructure module boundaries (NestJS)",
|
|
292
|
+
},
|
|
293
|
+
"nest-catch-all-filter": {
|
|
294
|
+
regex: /@Catch\s*\(\s*\)/,
|
|
295
|
+
description: "@Catch() with no argument — catches all exceptions indiscriminately (NestJS)",
|
|
296
|
+
},
|
|
297
|
+
"nest-request-scope": {
|
|
298
|
+
regex: /scope:\s*Scope\.REQUEST/,
|
|
299
|
+
description: "Request-scoped provider — performance overhead, breaks singleton assumptions (NestJS)",
|
|
300
|
+
},
|
|
301
|
+
"nest-raw-exception": {
|
|
302
|
+
regex: /throw\s+new\s+Error\s*\(/,
|
|
303
|
+
description: "Raw Error thrown instead of NestJS HttpException/BadRequestException (NestJS)",
|
|
304
|
+
},
|
|
305
|
+
"nest-any-guard-return": {
|
|
306
|
+
regex: /canActivate[\s\S]{0,100}return\s+true\s*;/,
|
|
307
|
+
description: "Guard always returns true — security no-op (NestJS)",
|
|
308
|
+
},
|
|
309
|
+
"nest-service-locator": {
|
|
310
|
+
regex: /moduleRef\s*\.\s*(?:get|resolve)\s*\(/,
|
|
311
|
+
description: "Service locator via ModuleRef.get/resolve — use constructor injection instead (NestJS)",
|
|
312
|
+
},
|
|
313
|
+
"nest-direct-env": {
|
|
314
|
+
regex: /process\.env\.\w+/,
|
|
315
|
+
description: "Direct process.env access — use ConfigService for type-safe config (NestJS)",
|
|
316
|
+
},
|
|
317
|
+
// Wave 2 anti-patterns
|
|
318
|
+
"nest-graphql-no-auth": {
|
|
319
|
+
// R-7 fix: restrict to .resolver.ts files (via fileIncludePattern) to avoid
|
|
320
|
+
// false positives on REST @Query() params. Regex checks for @Resolver + @Query/@Mutation
|
|
321
|
+
// present AND no @UseGuards anywhere in the matched span (capped at 2000 chars to avoid
|
|
322
|
+
// catastrophic backtracking — O(n) since the negation only runs once per symbol source).
|
|
323
|
+
regex: /^(?![\s\S]*@UseGuards)[\s\S]*@Resolver\s*\([\s\S]{0,500}?@(?:Query|Mutation)\s*\(/,
|
|
324
|
+
description: "GraphQL resolver with @Query/@Mutation but no @UseGuards in file — likely unprotected (NestJS)",
|
|
325
|
+
fileIncludePattern: /\.resolver\.[jt]sx?$/,
|
|
326
|
+
},
|
|
327
|
+
"nest-eager-relation": {
|
|
328
|
+
regex: /@(?:OneToMany|ManyToOne|OneToOne|ManyToMany)\s*\(\s*\(\)\s*=>\s*\w+[\s\S]{0,200}\beager:\s*true/,
|
|
329
|
+
description: "TypeORM relation with { eager: true } — auto-loads joins on every query (NestJS)",
|
|
330
|
+
},
|
|
331
|
+
// Astro anti-patterns
|
|
332
|
+
"astro-client-on-astro": {
|
|
333
|
+
regex: /client:(load|idle|visible|media|only).*\.astro/,
|
|
334
|
+
description: "client directive on .astro component import (Astro components cannot hydrate)",
|
|
335
|
+
},
|
|
336
|
+
"astro-glob-usage": {
|
|
337
|
+
regex: /Astro\.glob\s*\(/,
|
|
338
|
+
description: "deprecated Astro.glob() — use getCollection() or import.meta.glob()",
|
|
339
|
+
},
|
|
340
|
+
"astro-set-html-xss": {
|
|
341
|
+
regex: /set:html=\{[^"'][^}]*\}/,
|
|
342
|
+
description: "set:html with dynamic content — potential XSS risk",
|
|
343
|
+
},
|
|
344
|
+
"astro-img-element": {
|
|
345
|
+
regex: /<img\s/,
|
|
346
|
+
description: "raw <img> element — use <Image> from astro:assets for optimization",
|
|
347
|
+
},
|
|
348
|
+
"astro-missing-getStaticPaths": {
|
|
349
|
+
regex: /\[[\w.]+\]\.astro/,
|
|
350
|
+
description: "dynamic route file — verify getStaticPaths is exported",
|
|
351
|
+
},
|
|
352
|
+
"astro-legacy-content-collections": {
|
|
353
|
+
regex: /src\/content\/config\.ts/,
|
|
354
|
+
description: "legacy content collection config — migrate to src/content.config.ts",
|
|
355
|
+
},
|
|
356
|
+
"astro-no-image-dimensions": {
|
|
357
|
+
regex: /<Image\s+(?![^>]*(?:width|height)\s*=)[^>]*\/?>/,
|
|
358
|
+
description: "<Image> without width/height — causes CLS (Cumulative Layout Shift)",
|
|
359
|
+
},
|
|
360
|
+
"astro-inline-script-no-is-inline": {
|
|
361
|
+
regex: /<script(?!\s+is:inline)(?:\s[^>]*)?>[\s\S]*?<\/script>/,
|
|
362
|
+
description: "<script> without is:inline — Astro will process/bundle it; add is:inline for raw passthrough",
|
|
363
|
+
},
|
|
364
|
+
"astro-env-secret-in-client": {
|
|
365
|
+
regex: /import\.meta\.env\.SECRET_/,
|
|
366
|
+
description: "import.meta.env.SECRET_* accessed — secret env vars are server-only, undefined in client components",
|
|
367
|
+
},
|
|
368
|
+
"astro-hardcoded-site-url": {
|
|
369
|
+
regex: /(?:href|src|url)\s*=\s*["']https?:\/\/(?!\/\/)[^"']*["']/,
|
|
370
|
+
description: "hardcoded absolute URL — use Astro.site or relative paths for portability",
|
|
371
|
+
},
|
|
372
|
+
"astro-missing-lang-attr": {
|
|
373
|
+
regex: /<html(?!\s[^>]*\blang\s*=)[^>]*>/,
|
|
374
|
+
description: "<html> without lang attribute — required for accessibility (WCAG 3.1.1)",
|
|
375
|
+
},
|
|
376
|
+
"astro-form-without-action": {
|
|
377
|
+
regex: /<form(?!\s[^>]*\baction\s*=)[^>]*>/,
|
|
378
|
+
description: "<form> without action attribute — consider Astro Actions for type-safe form handling",
|
|
379
|
+
},
|
|
380
|
+
// Next.js anti-patterns
|
|
381
|
+
"nextjs-wrong-router": {
|
|
382
|
+
regex: /from\s+['"]next\/router['"]|require\s*\(\s*['"]next\/router['"]\s*\)/,
|
|
383
|
+
description: "Using next/router (Pages Router) in App Router file — use next/navigation instead",
|
|
384
|
+
fileExcludePattern: /(^|\/)pages\//,
|
|
385
|
+
},
|
|
386
|
+
"nextjs-fetch-waterfall": {
|
|
387
|
+
regex: /await\s+fetch\s*\([^)]*\)[\s\S]{0,300}await\s+fetch\s*\(/,
|
|
388
|
+
description: "Sequential await fetch calls — use Promise.all to avoid waterfall (Next.js performance)",
|
|
389
|
+
},
|
|
390
|
+
"nextjs-unnecessary-use-client": {
|
|
391
|
+
regex: /['"]use client['"](?![\s\S]*(?:useState|useEffect|useRef|useCallback|useMemo|useContext|useReducer|onClick|onChange|onSubmit|window\.|document\.|localStorage\.))/,
|
|
392
|
+
description: "File has 'use client' but may not need it — no hooks, events, or browser globals detected",
|
|
393
|
+
},
|
|
394
|
+
"nextjs-pages-in-app": {
|
|
395
|
+
regex: /./,
|
|
396
|
+
description: "Pages Router convention (index.tsx) inside app/ directory — use page.tsx for App Router",
|
|
397
|
+
fileIncludePattern: /(^|\/)app\/.*\/index\.(tsx|jsx|ts|js)$|^app\/index\.(tsx|jsx|ts|js)$/,
|
|
398
|
+
},
|
|
399
|
+
"nextjs-missing-error-boundary": {
|
|
400
|
+
regex: /./,
|
|
401
|
+
description: "Page file without sibling error.tsx — no error boundary for graceful error handling",
|
|
402
|
+
fileIncludePattern: /(^|\/)app\/.*\/page\.[jt]sx?$/,
|
|
403
|
+
},
|
|
404
|
+
"nextjs-use-client-in-layout": {
|
|
405
|
+
regex: /^[\s\S]{0,512}['"]use client['"]/,
|
|
406
|
+
description: "Layout file with 'use client' — layouts should be Server Components for optimal performance",
|
|
407
|
+
fileIncludePattern: /(^|\/)app\/.*\/layout\.[jt]sx?$|^app\/layout\.[jt]sx?$/,
|
|
408
|
+
},
|
|
409
|
+
"nextjs-missing-metadata": {
|
|
410
|
+
regex: /./,
|
|
411
|
+
description: "Page file without metadata or generateMetadata export — missing SEO metadata",
|
|
412
|
+
fileIncludePattern: /(^|\/)app\/.*\/page\.[jt]sx?$/,
|
|
413
|
+
},
|
|
414
|
+
"nextjs-missing-use-client": {
|
|
415
|
+
// Match files containing client-only API references that do NOT begin with
|
|
416
|
+
// a "use client" / 'use client' / `use client` directive in the first 512 bytes.
|
|
417
|
+
regex: /^(?![\s\S]{0,512}["'`]use client["'`])[\s\S]*(?:useState|useEffect|useRef|useCallback|useMemo|useContext|onClick=|onChange=|onSubmit=)/,
|
|
418
|
+
description: "Client-only API used without 'use client' directive — component will error at build (Next.js App Router)",
|
|
419
|
+
fileIncludePattern: /(^|\/)app\/.*\.(tsx|jsx)$/,
|
|
420
|
+
},
|
|
421
|
+
// --- Hono anti-patterns (Task 15) ---
|
|
422
|
+
"hono-missing-error-handler": {
|
|
423
|
+
regex: /new\s+(?:Hono|OpenAPIHono)\s*(?:<[^>]*>)?\s*\(\s*\)(?!(?:[\s\S](?!new\s+(?:Hono|OpenAPIHono)))*\.onError)/,
|
|
424
|
+
description: "Hono app created without .onError() handler — unhandled exceptions return 500 with no logging",
|
|
425
|
+
},
|
|
426
|
+
"hono-throw-raw-error": {
|
|
427
|
+
regex: /\(\s*c\s*:\s*Context\s*(?:,\s*next\s*:\s*Next\s*)?\)[\s\S]*?\bthrow\s+new\s+Error\s*\(/,
|
|
428
|
+
description: "throw new Error() inside Hono handler — use HTTPException for proper status code handling",
|
|
429
|
+
},
|
|
430
|
+
"hono-missing-validator": {
|
|
431
|
+
regex: /await\s+c\.req\.(?:json|parseBody)\s*\(\s*\)(?![\s\S]{0,400}?zValidator)/,
|
|
432
|
+
description: "c.req.json()/parseBody() without preceding zValidator — unvalidated request body",
|
|
433
|
+
},
|
|
434
|
+
"hono-unguarded-json-parse": {
|
|
435
|
+
regex: /(?<!try\s*\{[\s\S]{0,200})await\s+c\.req\.json\s*\(\s*\)/,
|
|
436
|
+
description: "await c.req.json() without try/catch — malformed JSON crashes handler",
|
|
437
|
+
},
|
|
438
|
+
"hono-env-type-any": {
|
|
439
|
+
regex: /new\s+Hono\s*\(\s*\)(?!\s*<)/,
|
|
440
|
+
description: "new Hono() without <Env> generic — loses type safety on c.env and c.var",
|
|
441
|
+
},
|
|
442
|
+
"hono-missing-status-code": {
|
|
443
|
+
regex: /\bc\.json\s*\(\s*\{[^}]+\}\s*\)/,
|
|
444
|
+
description: "c.json() without explicit status code — defaults to 200 even for errors/creations",
|
|
445
|
+
},
|
|
446
|
+
"hono-full-app-rpc-export": {
|
|
447
|
+
regex: /export\s+type\s+\w+\s*=\s*typeof\s+app\b/,
|
|
448
|
+
description: "export type X = typeof app — slow RPC pattern (Issue #3869, 8-min CI builds). Use typeof routeGroup instead",
|
|
449
|
+
},
|
|
450
|
+
// --- Database / ORM anti-patterns (db-audit feedback) ---
|
|
451
|
+
"unsafe-raw-sql": {
|
|
452
|
+
regex: /(?:\$queryRawUnsafe|\$executeRawUnsafe|knex\.raw|sequelize\.query|db\.raw)\s*\(\s*[`"'][^`"']*\$\{/,
|
|
453
|
+
description: "Raw SQL with template-string interpolation — SQL injection risk. Use parameterized $queryRaw`...` or query builder. Covers Prisma/Knex/Sequelize/Drizzle.",
|
|
454
|
+
},
|
|
455
|
+
"transaction-external-io": {
|
|
456
|
+
regex: /\$transaction\s*\(\s*async\s*\([^)]*\)\s*=>\s*\{[\s\S]{0,2000}?\b(?:fetch|axios|http|stripe|sendgrid|twilio|sendEmail|publishEvent|enqueue)\s*[.(]/,
|
|
457
|
+
description: "External I/O (fetch/HTTP/email/queue) inside Prisma $transaction callback — long-running transactions hold locks. Move I/O after commit.",
|
|
458
|
+
},
|
|
459
|
+
"migration-create-index-no-concurrently": {
|
|
460
|
+
regex: /CREATE\s+(?:UNIQUE\s+)?INDEX(?!\s+CONCURRENTLY)/i,
|
|
461
|
+
description: "CREATE INDEX without CONCURRENTLY — locks the table during build. Use CREATE INDEX CONCURRENTLY in PostgreSQL migrations.",
|
|
462
|
+
fileIncludePattern: /\/migrations?\/.*\.sql$/,
|
|
463
|
+
},
|
|
464
|
+
"migration-drop-column": {
|
|
465
|
+
regex: /\bALTER\s+TABLE[\s\S]{0,200}\bDROP\s+COLUMN\b/i,
|
|
466
|
+
description: "DROP COLUMN in migration — destructive, breaks rolling deploys. Use multi-step deprecation: stop writes → backfill → drop in next release.",
|
|
467
|
+
fileIncludePattern: /\/migrations?\/.*\.sql$/,
|
|
468
|
+
},
|
|
469
|
+
"migration-alter-column-type": {
|
|
470
|
+
regex: /\bALTER\s+TABLE[\s\S]{0,200}\bALTER\s+COLUMN[\s\S]{0,200}\bTYPE\b/i,
|
|
471
|
+
description: "ALTER COLUMN TYPE in migration — full table rewrite, locks table. Use ADD COLUMN + backfill + DROP COLUMN in separate releases.",
|
|
472
|
+
fileIncludePattern: /\/migrations?\/.*\.sql$/,
|
|
473
|
+
},
|
|
474
|
+
"migration-not-null-no-default": {
|
|
475
|
+
regex: /\bADD\s+COLUMN\b[\s\S]{0,200}\bNOT\s+NULL\b(?![\s\S]{0,100}\bDEFAULT\b)/i,
|
|
476
|
+
description: "ADD COLUMN NOT NULL without DEFAULT — fails on existing rows. Add as nullable first, backfill, then add NOT NULL constraint.",
|
|
477
|
+
fileIncludePattern: /\/migrations?\/.*\.sql$/,
|
|
478
|
+
},
|
|
479
|
+
// --- Python anti-patterns ---
|
|
480
|
+
"mutable-default": {
|
|
481
|
+
regex: /def\s+\w+\s*\([^)]*=\s*(?:\[\s*\]|\{\s*\}|set\s*\(\s*\))/,
|
|
482
|
+
description: "Mutable default argument ([], {}, set()) — shared between calls (Python)",
|
|
483
|
+
},
|
|
484
|
+
"bare-except": {
|
|
485
|
+
regex: /except\s*:/,
|
|
486
|
+
description: "Bare except: catches everything including KeyboardInterrupt (Python)",
|
|
487
|
+
},
|
|
488
|
+
"broad-except": {
|
|
489
|
+
regex: /except\s+(?:Exception|BaseException)\s*:/,
|
|
490
|
+
description: "Broad exception catch — hides real errors (Python)",
|
|
491
|
+
},
|
|
492
|
+
"global-keyword": {
|
|
493
|
+
regex: /\bglobal\s+\w+/,
|
|
494
|
+
description: "global keyword — mutable global state makes code hard to test (Python)",
|
|
495
|
+
},
|
|
496
|
+
"star-import": {
|
|
497
|
+
regex: /from\s+\S+\s+import\s+\*/,
|
|
498
|
+
description: "Star import — pollutes namespace, breaks static analysis (Python)",
|
|
499
|
+
},
|
|
500
|
+
"print-debug-py": {
|
|
501
|
+
regex: /^\s*print\s*\(/m,
|
|
502
|
+
description: "print() in production code — use logging module (Python)",
|
|
503
|
+
},
|
|
504
|
+
"eval-exec": {
|
|
505
|
+
regex: /\b(?:eval|exec)\s*\(/,
|
|
506
|
+
description: "eval()/exec() — code injection risk (Python)",
|
|
507
|
+
},
|
|
508
|
+
"shell-true": {
|
|
509
|
+
regex: /subprocess\.\w+\s*\([^)]*shell\s*=\s*True/,
|
|
510
|
+
description: "subprocess with shell=True — command injection risk (Python)",
|
|
511
|
+
},
|
|
512
|
+
"pickle-load": {
|
|
513
|
+
regex: /pickle\.(?:load|loads)\s*\(/,
|
|
514
|
+
description: "pickle.load/loads — arbitrary code execution from untrusted data (Python)",
|
|
515
|
+
},
|
|
516
|
+
"yaml-unsafe": {
|
|
517
|
+
regex: /yaml\.load\s*\([^)]*\)(?![\s\S]{0,30}Loader)/,
|
|
518
|
+
description: "yaml.load without SafeLoader — arbitrary code execution risk (Python)",
|
|
519
|
+
},
|
|
520
|
+
"open-no-with": {
|
|
521
|
+
regex: /(?<!with\s{1,20})\bopen\s*\([^)]+\)\s*(?:\.\w+|;|$)/m,
|
|
522
|
+
description: "open() without with statement — resource leak if exception occurs (Python)",
|
|
523
|
+
},
|
|
524
|
+
"string-concat-loop": {
|
|
525
|
+
regex: /for\s+\w+\s+in\s+[\s\S]{0,200}?\+=\s*(?:['"]|f['"]|str\()/,
|
|
526
|
+
description: "String concatenation in loop — O(n^2), use join() or list append (Python)",
|
|
527
|
+
},
|
|
528
|
+
"datetime-naive": {
|
|
529
|
+
regex: /datetime\.(?:now|utcnow)\s*\(\s*\)/,
|
|
530
|
+
description: "datetime.now()/utcnow() without timezone — naive datetime causes bugs (Python)",
|
|
531
|
+
},
|
|
532
|
+
"shadow-builtin": {
|
|
533
|
+
regex: /^(?:list|dict|set|id|type|input|map|filter|range|str|int|float|bool|tuple|bytes|object|print|open|format|len|sum|min|max|any|all|zip|enumerate|sorted|reversed|next|iter|super|hash|dir|vars|globals|locals)\s*=/m,
|
|
534
|
+
description: "Assignment shadows Python builtin — breaks code that uses the builtin later (Python)",
|
|
535
|
+
},
|
|
536
|
+
"n-plus-one-django": {
|
|
537
|
+
regex: /for\s+\w+\s+in\s+[\s\S]{0,300}?\.\w+_set\b|\.\w+\.all\(\)/,
|
|
538
|
+
description: "Potential N+1 query — accessing related objects in loop without select_related/prefetch_related (Django)",
|
|
539
|
+
},
|
|
540
|
+
"late-binding": {
|
|
541
|
+
regex: /for\s+(\w+)\s+in\s+[\s\S]{0,200}?lambda\s*[^:]*:\s*\1\b/,
|
|
542
|
+
description: "Late binding closure in loop — all lambdas share last loop value (Python)",
|
|
543
|
+
},
|
|
544
|
+
"assert-tuple": {
|
|
545
|
+
regex: /\bassert\s*\(/,
|
|
546
|
+
description: "assert(expr) — always True because tuple is truthy. Use assert expr without parens (Python)",
|
|
547
|
+
},
|
|
41
548
|
};
|
|
42
549
|
/**
|
|
43
550
|
* Search for structural code patterns across indexed symbols.
|
|
@@ -54,10 +561,14 @@ export async function searchPatterns(repo, pattern, options) {
|
|
|
54
561
|
// Resolve pattern: built-in name or custom regex
|
|
55
562
|
let regex;
|
|
56
563
|
let patternName;
|
|
564
|
+
let fileExcludePattern;
|
|
565
|
+
let fileIncludePattern;
|
|
57
566
|
const builtin = BUILTIN_PATTERNS[pattern];
|
|
58
567
|
if (builtin) {
|
|
59
568
|
regex = builtin.regex;
|
|
60
569
|
patternName = `${pattern}: ${builtin.description}`;
|
|
570
|
+
fileExcludePattern = builtin.fileExcludePattern;
|
|
571
|
+
fileIncludePattern = builtin.fileIncludePattern;
|
|
61
572
|
}
|
|
62
573
|
else {
|
|
63
574
|
try {
|
|
@@ -80,6 +591,10 @@ export async function searchPatterns(repo, pattern, options) {
|
|
|
80
591
|
continue;
|
|
81
592
|
if (filePattern && !sym.file.includes(filePattern))
|
|
82
593
|
continue;
|
|
594
|
+
if (fileExcludePattern && fileExcludePattern.test(sym.file))
|
|
595
|
+
continue;
|
|
596
|
+
if (fileIncludePattern && !fileIncludePattern.test(sym.file))
|
|
597
|
+
continue;
|
|
83
598
|
scanned++;
|
|
84
599
|
const match = regex.exec(sym.source);
|
|
85
600
|
if (match) {
|
|
@@ -98,6 +613,47 @@ export async function searchPatterns(repo, pattern, options) {
|
|
|
98
613
|
});
|
|
99
614
|
}
|
|
100
615
|
}
|
|
616
|
+
// File-level scanning fallback for patterns targeting non-source files
|
|
617
|
+
// (e.g. SQL migrations, .env files). Triggered when fileIncludePattern is set.
|
|
618
|
+
// This iterates index.files and reads them directly — needed because such
|
|
619
|
+
// files have no parsed symbols.
|
|
620
|
+
if (fileIncludePattern) {
|
|
621
|
+
for (const fileEntry of index.files) {
|
|
622
|
+
if (matches.length >= maxResults)
|
|
623
|
+
break;
|
|
624
|
+
if (!fileIncludePattern.test(fileEntry.path))
|
|
625
|
+
continue;
|
|
626
|
+
if (filePattern && !fileEntry.path.includes(filePattern))
|
|
627
|
+
continue;
|
|
628
|
+
if (fileExcludePattern && fileExcludePattern.test(fileEntry.path))
|
|
629
|
+
continue;
|
|
630
|
+
// Skip files that already had symbol matches above (avoid duplicates)
|
|
631
|
+
if (matches.some((m) => m.file === fileEntry.path))
|
|
632
|
+
continue;
|
|
633
|
+
let content;
|
|
634
|
+
try {
|
|
635
|
+
content = await readFile(join(index.root, fileEntry.path), "utf-8");
|
|
636
|
+
}
|
|
637
|
+
catch {
|
|
638
|
+
continue;
|
|
639
|
+
}
|
|
640
|
+
scanned++;
|
|
641
|
+
const match = regex.exec(content);
|
|
642
|
+
if (match) {
|
|
643
|
+
const linesBefore = content.slice(0, match.index).split("\n").length;
|
|
644
|
+
const matchedText = match[0].split("\n")[0];
|
|
645
|
+
matches.push({
|
|
646
|
+
name: fileEntry.path.split("/").pop() ?? fileEntry.path,
|
|
647
|
+
kind: "function", // file-level match has no symbol kind
|
|
648
|
+
file: fileEntry.path,
|
|
649
|
+
start_line: linesBefore,
|
|
650
|
+
end_line: linesBefore,
|
|
651
|
+
matched_pattern: patternName,
|
|
652
|
+
context: matchedText.trim().slice(0, 200),
|
|
653
|
+
});
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
}
|
|
101
657
|
return {
|
|
102
658
|
matches,
|
|
103
659
|
pattern: patternName,
|
|
@@ -108,9 +664,11 @@ export async function searchPatterns(repo, pattern, options) {
|
|
|
108
664
|
* List all available built-in patterns.
|
|
109
665
|
*/
|
|
110
666
|
export function listPatterns() {
|
|
111
|
-
return Object.entries(BUILTIN_PATTERNS).map(([name,
|
|
667
|
+
return Object.entries(BUILTIN_PATTERNS).map(([name, p]) => ({
|
|
112
668
|
name,
|
|
113
|
-
description,
|
|
669
|
+
description: p.description,
|
|
670
|
+
...(p.fileExcludePattern ? { fileExcludePattern: p.fileExcludePattern.source } : {}),
|
|
671
|
+
...(p.fileIncludePattern ? { fileIncludePattern: p.fileIncludePattern.source } : {}),
|
|
114
672
|
}));
|
|
115
673
|
}
|
|
116
674
|
//# sourceMappingURL=pattern-tools.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pattern-tools.js","sourceRoot":"","sources":["../../src/tools/pattern-tools.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pattern-tools.js","sourceRoot":"","sources":["../../src/tools/pattern-tools.ts"],"names":[],"mappings":"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"}
|