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
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Next.js metadata audit (T1).
|
|
3
|
+
*
|
|
4
|
+
* Walks `app/**\/page.{tsx,jsx,ts,js}` files for `metadata` /
|
|
5
|
+
* `generateMetadata` exports, scores each page using a weighted formula
|
|
6
|
+
* (per design D4), and aggregates a per-route audit result with grade
|
|
7
|
+
* distribution and top issues.
|
|
8
|
+
*/
|
|
9
|
+
import { type MetadataFields } from "../utils/nextjs.js";
|
|
10
|
+
export type MetadataGrade = "poor" | "needs_work" | "good" | "excellent";
|
|
11
|
+
export interface MetadataField {
|
|
12
|
+
name: string;
|
|
13
|
+
present: boolean;
|
|
14
|
+
weight: number;
|
|
15
|
+
}
|
|
16
|
+
export interface MetadataScore {
|
|
17
|
+
score: number;
|
|
18
|
+
grade: MetadataGrade;
|
|
19
|
+
violations: string[];
|
|
20
|
+
}
|
|
21
|
+
export interface NextjsMetadataAuditEntry {
|
|
22
|
+
url_path: string;
|
|
23
|
+
file_path: string;
|
|
24
|
+
score: number;
|
|
25
|
+
grade: MetadataGrade;
|
|
26
|
+
violations: string[];
|
|
27
|
+
missing_fields: string[];
|
|
28
|
+
}
|
|
29
|
+
export interface NextjsMetadataAuditCounts {
|
|
30
|
+
excellent: number;
|
|
31
|
+
good: number;
|
|
32
|
+
needs_work: number;
|
|
33
|
+
poor: number;
|
|
34
|
+
}
|
|
35
|
+
export interface NextjsMetadataAuditResult {
|
|
36
|
+
total_pages: number;
|
|
37
|
+
scores: NextjsMetadataAuditEntry[];
|
|
38
|
+
counts: NextjsMetadataAuditCounts;
|
|
39
|
+
top_issues: string[];
|
|
40
|
+
workspaces_scanned: string[];
|
|
41
|
+
parse_failures: string[];
|
|
42
|
+
scan_errors: string[];
|
|
43
|
+
limitations: string[];
|
|
44
|
+
}
|
|
45
|
+
export interface NextjsMetadataAuditOptions {
|
|
46
|
+
workspace?: string | undefined;
|
|
47
|
+
max_routes?: number | undefined;
|
|
48
|
+
}
|
|
49
|
+
export type { MetadataFields };
|
|
50
|
+
/** Field weights per design D4. Sum = 100. */
|
|
51
|
+
export declare const METADATA_WEIGHTS: {
|
|
52
|
+
readonly title: 25;
|
|
53
|
+
readonly description: 20;
|
|
54
|
+
readonly og_image: 20;
|
|
55
|
+
readonly canonical: 15;
|
|
56
|
+
readonly twitter: 10;
|
|
57
|
+
readonly json_ld: 10;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Score a `MetadataFields` object against the weighted rubric (D4).
|
|
61
|
+
*
|
|
62
|
+
* Pure function — no I/O, no AST. Returns a numeric score 0-100, a grade
|
|
63
|
+
* bucket, and a list of violation tags. Length gates zero out title/desc
|
|
64
|
+
* scores when below thresholds. Placeholder OG images zero out the OG image
|
|
65
|
+
* score and flag a violation.
|
|
66
|
+
*/
|
|
67
|
+
export declare function scoreMetadata(fields: MetadataFields): MetadataScore;
|
|
68
|
+
/**
|
|
69
|
+
* Audit a Next.js project's metadata coverage. Walks app/page.* files,
|
|
70
|
+
* extracts metadata via tree-sitter, scores each page, and returns a per-route
|
|
71
|
+
* + aggregate report.
|
|
72
|
+
*/
|
|
73
|
+
export declare function nextjsMetadataAudit(repo: string, options?: NextjsMetadataAuditOptions): Promise<NextjsMetadataAuditResult>;
|
|
74
|
+
//# sourceMappingURL=nextjs-metadata-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextjs-metadata-tools.d.ts","sourceRoot":"","sources":["../../src/tools/nextjs-metadata-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAS5B,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,YAAY,GAAG,MAAM,GAAG,WAAW,CAAC;AAEzE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,wBAAwB,EAAE,CAAC;IACnC,MAAM,EAAE,yBAAyB,CAAC;IAClC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAGD,YAAY,EAAE,cAAc,EAAE,CAAC;AAM/B,8CAA8C;AAC9C,eAAO,MAAM,gBAAgB;;;;;;;CAOnB,CAAC;AAoBX;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,aAAa,CAoDnE;AA+BD;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,yBAAyB,CAAC,CAuHpC"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Next.js metadata audit (T1).
|
|
3
|
+
*
|
|
4
|
+
* Walks `app/**\/page.{tsx,jsx,ts,js}` files for `metadata` /
|
|
5
|
+
* `generateMetadata` exports, scores each page using a weighted formula
|
|
6
|
+
* (per design D4), and aggregates a per-route audit result with grade
|
|
7
|
+
* distribution and top issues.
|
|
8
|
+
*/
|
|
9
|
+
import { readFile } from "node:fs/promises";
|
|
10
|
+
import { join, relative } from "node:path";
|
|
11
|
+
import { deriveUrlPath, discoverWorkspaces, parseMetadataExport, } from "../utils/nextjs.js";
|
|
12
|
+
import { cachedParseFile as parseFile } from "../utils/nextjs-audit-cache.js";
|
|
13
|
+
import { cachedWalkDirectory as walkDirectory } from "../utils/nextjs-audit-cache.js";
|
|
14
|
+
import { getCodeIndex } from "./index-tools.js";
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Pure scoring function (Task 9)
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
/** Field weights per design D4. Sum = 100. */
|
|
19
|
+
export const METADATA_WEIGHTS = {
|
|
20
|
+
title: 25,
|
|
21
|
+
description: 20,
|
|
22
|
+
og_image: 20,
|
|
23
|
+
canonical: 15,
|
|
24
|
+
twitter: 10,
|
|
25
|
+
json_ld: 10,
|
|
26
|
+
};
|
|
27
|
+
const TITLE_MIN_LENGTH = 10;
|
|
28
|
+
const DESCRIPTION_MIN_LENGTH = 50;
|
|
29
|
+
/** Substrings that mark an OG image as a placeholder, not a real per-route asset. */
|
|
30
|
+
const PLACEHOLDER_OG_IMAGES = ["/og-image.png", "/favicon.ico", ""];
|
|
31
|
+
function isPlaceholderOgImage(url) {
|
|
32
|
+
if (!url || url.trim() === "")
|
|
33
|
+
return true;
|
|
34
|
+
return PLACEHOLDER_OG_IMAGES.includes(url);
|
|
35
|
+
}
|
|
36
|
+
function gradeFromScore(score) {
|
|
37
|
+
if (score >= 90)
|
|
38
|
+
return "excellent";
|
|
39
|
+
if (score >= 70)
|
|
40
|
+
return "good";
|
|
41
|
+
if (score >= 40)
|
|
42
|
+
return "needs_work";
|
|
43
|
+
return "poor";
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Score a `MetadataFields` object against the weighted rubric (D4).
|
|
47
|
+
*
|
|
48
|
+
* Pure function — no I/O, no AST. Returns a numeric score 0-100, a grade
|
|
49
|
+
* bucket, and a list of violation tags. Length gates zero out title/desc
|
|
50
|
+
* scores when below thresholds. Placeholder OG images zero out the OG image
|
|
51
|
+
* score and flag a violation.
|
|
52
|
+
*/
|
|
53
|
+
export function scoreMetadata(fields) {
|
|
54
|
+
let score = 0;
|
|
55
|
+
const violations = [];
|
|
56
|
+
// Title (weight 25, length gate)
|
|
57
|
+
if (fields.title) {
|
|
58
|
+
if (fields.title.length >= TITLE_MIN_LENGTH) {
|
|
59
|
+
score += METADATA_WEIGHTS.title;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
violations.push("title_too_short");
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Description (weight 20, length gate)
|
|
66
|
+
if (fields.description) {
|
|
67
|
+
if (fields.description.length >= DESCRIPTION_MIN_LENGTH) {
|
|
68
|
+
score += METADATA_WEIGHTS.description;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
violations.push("description_too_short");
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Open Graph image (weight 20, placeholder check)
|
|
75
|
+
const ogImage = fields.openGraph?.images?.[0];
|
|
76
|
+
if (ogImage) {
|
|
77
|
+
if (isPlaceholderOgImage(ogImage)) {
|
|
78
|
+
violations.push("og_image_placeholder");
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
score += METADATA_WEIGHTS.og_image;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Canonical (weight 15)
|
|
85
|
+
if (fields.alternates?.canonical) {
|
|
86
|
+
score += METADATA_WEIGHTS.canonical;
|
|
87
|
+
}
|
|
88
|
+
// Twitter card (weight 10)
|
|
89
|
+
if (fields.twitter?.card) {
|
|
90
|
+
score += METADATA_WEIGHTS.twitter;
|
|
91
|
+
}
|
|
92
|
+
// JSON-LD (weight 10) — detected via the `other` catch-all
|
|
93
|
+
if (fields.other && Object.keys(fields.other).length > 0) {
|
|
94
|
+
score += METADATA_WEIGHTS.json_ld;
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
score,
|
|
98
|
+
grade: gradeFromScore(score),
|
|
99
|
+
violations,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
// Orchestrator (Task 10)
|
|
104
|
+
// ---------------------------------------------------------------------------
|
|
105
|
+
const PAGE_FILENAME_RE = /(^|\/)page\.(tsx|jsx|ts|js)$/;
|
|
106
|
+
const PAGE_EXTS = new Set([".tsx", ".jsx", ".ts", ".js"]);
|
|
107
|
+
const DEFAULT_MAX_ROUTES = 1000;
|
|
108
|
+
const PARSE_CONCURRENCY = 10;
|
|
109
|
+
const MAX_FILE_SIZE_BYTES = 2_097_152;
|
|
110
|
+
/** Compute the union of present-but-zero / missing fields per the scorer rubric. */
|
|
111
|
+
function missingFieldsFor(fields, score) {
|
|
112
|
+
const missing = [];
|
|
113
|
+
if (!fields.title)
|
|
114
|
+
missing.push("title");
|
|
115
|
+
if (!fields.description)
|
|
116
|
+
missing.push("description");
|
|
117
|
+
if (!fields.openGraph?.images?.[0])
|
|
118
|
+
missing.push("og_image");
|
|
119
|
+
if (!fields.alternates?.canonical)
|
|
120
|
+
missing.push("canonical");
|
|
121
|
+
if (!fields.twitter?.card)
|
|
122
|
+
missing.push("twitter");
|
|
123
|
+
if (!fields.other || Object.keys(fields.other).length === 0)
|
|
124
|
+
missing.push("json_ld");
|
|
125
|
+
// Length-gate violations also count as missing for reporter purposes.
|
|
126
|
+
if (score.violations.includes("title_too_short") && !missing.includes("title")) {
|
|
127
|
+
missing.push("title");
|
|
128
|
+
}
|
|
129
|
+
if (score.violations.includes("description_too_short") && !missing.includes("description")) {
|
|
130
|
+
missing.push("description");
|
|
131
|
+
}
|
|
132
|
+
return missing;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Audit a Next.js project's metadata coverage. Walks app/page.* files,
|
|
136
|
+
* extracts metadata via tree-sitter, scores each page, and returns a per-route
|
|
137
|
+
* + aggregate report.
|
|
138
|
+
*/
|
|
139
|
+
export async function nextjsMetadataAudit(repo, options) {
|
|
140
|
+
if (process.env.CODESIFT_DISABLE_TOOLS?.includes("nextjs_metadata_audit")) {
|
|
141
|
+
throw new Error("nextjs_metadata_audit is disabled via CODESIFT_DISABLE_TOOLS");
|
|
142
|
+
}
|
|
143
|
+
const index = await getCodeIndex(repo);
|
|
144
|
+
if (!index) {
|
|
145
|
+
throw new Error(`Repository not found: ${repo}. Run index_folder first.`);
|
|
146
|
+
}
|
|
147
|
+
const projectRoot = index.root;
|
|
148
|
+
// Resolve workspaces
|
|
149
|
+
let workspaces;
|
|
150
|
+
if (options?.workspace) {
|
|
151
|
+
workspaces = [join(projectRoot, options.workspace)];
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
const discovered = await discoverWorkspaces(projectRoot);
|
|
155
|
+
workspaces = discovered.length > 0 ? discovered.map((w) => w.root) : [projectRoot];
|
|
156
|
+
}
|
|
157
|
+
const maxRoutes = options?.max_routes ?? DEFAULT_MAX_ROUTES;
|
|
158
|
+
const scores = [];
|
|
159
|
+
const parse_failures = [];
|
|
160
|
+
const scan_errors = [];
|
|
161
|
+
const workspaces_scanned = [];
|
|
162
|
+
const top_issues_counter = new Map();
|
|
163
|
+
for (const workspace of workspaces) {
|
|
164
|
+
workspaces_scanned.push(workspace);
|
|
165
|
+
const candidates = [];
|
|
166
|
+
for (const appDir of ["app", "src/app"]) {
|
|
167
|
+
const fullAppDir = join(workspace, appDir);
|
|
168
|
+
try {
|
|
169
|
+
const walked = await walkDirectory(fullAppDir, {
|
|
170
|
+
followSymlinks: true,
|
|
171
|
+
fileFilter: (ext) => PAGE_EXTS.has(ext),
|
|
172
|
+
maxFileSize: MAX_FILE_SIZE_BYTES,
|
|
173
|
+
});
|
|
174
|
+
for (const f of walked) {
|
|
175
|
+
if (PAGE_FILENAME_RE.test(f))
|
|
176
|
+
candidates.push(f);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
scan_errors.push(`${fullAppDir}: ${err instanceof Error ? err.message : String(err)}`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const remaining = maxRoutes - scores.length;
|
|
184
|
+
const toProcess = candidates.slice(0, Math.max(0, remaining));
|
|
185
|
+
for (let i = 0; i < toProcess.length; i += PARSE_CONCURRENCY) {
|
|
186
|
+
const chunk = toProcess.slice(i, i + PARSE_CONCURRENCY);
|
|
187
|
+
const entries = await Promise.all(chunk.map(async (filePath) => {
|
|
188
|
+
try {
|
|
189
|
+
const rel = relative(projectRoot, filePath);
|
|
190
|
+
const source = await readFile(filePath, "utf8");
|
|
191
|
+
const tree = await parseFile(filePath, source);
|
|
192
|
+
if (!tree) {
|
|
193
|
+
parse_failures.push(rel);
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
const fields = parseMetadataExport(tree, source);
|
|
197
|
+
const score = scoreMetadata(fields);
|
|
198
|
+
const missing_fields = missingFieldsFor(fields, score);
|
|
199
|
+
const url_path = deriveUrlPath(rel, "app");
|
|
200
|
+
const entry = {
|
|
201
|
+
url_path,
|
|
202
|
+
file_path: rel,
|
|
203
|
+
score: score.score,
|
|
204
|
+
grade: score.grade,
|
|
205
|
+
violations: score.violations,
|
|
206
|
+
missing_fields,
|
|
207
|
+
};
|
|
208
|
+
return entry;
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
const rel = relative(projectRoot, filePath);
|
|
212
|
+
parse_failures.push(`${rel}: ${err instanceof Error ? err.message : String(err)}`);
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
}));
|
|
216
|
+
for (const e of entries) {
|
|
217
|
+
if (!e)
|
|
218
|
+
continue;
|
|
219
|
+
scores.push(e);
|
|
220
|
+
for (const v of e.violations) {
|
|
221
|
+
top_issues_counter.set(v, (top_issues_counter.get(v) ?? 0) + 1);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// Aggregate counts by grade
|
|
227
|
+
const counts = {
|
|
228
|
+
excellent: 0,
|
|
229
|
+
good: 0,
|
|
230
|
+
needs_work: 0,
|
|
231
|
+
poor: 0,
|
|
232
|
+
};
|
|
233
|
+
for (const s of scores) {
|
|
234
|
+
counts[s.grade]++;
|
|
235
|
+
}
|
|
236
|
+
// Sort top issues by frequency desc, take top 5
|
|
237
|
+
const top_issues = [...top_issues_counter.entries()]
|
|
238
|
+
.sort((a, b) => b[1] - a[1])
|
|
239
|
+
.slice(0, 5)
|
|
240
|
+
.map(([violation, count]) => `${violation} (${count})`);
|
|
241
|
+
return {
|
|
242
|
+
total_pages: scores.length,
|
|
243
|
+
scores,
|
|
244
|
+
counts,
|
|
245
|
+
top_issues,
|
|
246
|
+
workspaces_scanned,
|
|
247
|
+
parse_failures,
|
|
248
|
+
scan_errors,
|
|
249
|
+
limitations: ["does not check remote Open Graph image resolution"],
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=nextjs-metadata-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextjs-metadata-tools.js","sourceRoot":"","sources":["../../src/tools/nextjs-metadata-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Next.js middleware coverage analyzer (T8).
|
|
3
|
+
*
|
|
4
|
+
* Cross-references the route map (via `nextjsRouteMap`) with the middleware
|
|
5
|
+
* matcher config (via existing `traceMiddleware`) to compute coverage:
|
|
6
|
+
* which routes are protected and which are unprotected. Flags admin routes
|
|
7
|
+
* without middleware as high-severity warnings.
|
|
8
|
+
*/
|
|
9
|
+
export interface CoverageMap {
|
|
10
|
+
protected: string[];
|
|
11
|
+
unprotected: string[];
|
|
12
|
+
total_routes: number;
|
|
13
|
+
}
|
|
14
|
+
export interface SecurityWarning {
|
|
15
|
+
severity: "high" | "medium" | "low";
|
|
16
|
+
route: string;
|
|
17
|
+
reason: string;
|
|
18
|
+
}
|
|
19
|
+
export interface CoverageEntry {
|
|
20
|
+
url_path: string;
|
|
21
|
+
protected: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface NextjsMiddlewareCoverageResult {
|
|
24
|
+
coverage: CoverageMap;
|
|
25
|
+
warnings: SecurityWarning[];
|
|
26
|
+
total: number;
|
|
27
|
+
workspaces_scanned: string[];
|
|
28
|
+
limitations: string[];
|
|
29
|
+
}
|
|
30
|
+
export interface NextjsMiddlewareCoverageOptions {
|
|
31
|
+
workspace?: string | undefined;
|
|
32
|
+
flag_admin_prefix?: string | string[] | undefined;
|
|
33
|
+
}
|
|
34
|
+
export declare function calculateCoverage(routes: Array<{
|
|
35
|
+
url_path: string;
|
|
36
|
+
}>, repoRoot: string): Promise<CoverageMap>;
|
|
37
|
+
export declare function flagSecurityWarnings(coverage: CoverageMap, options?: {
|
|
38
|
+
flag_admin_prefix?: string | string[];
|
|
39
|
+
}): SecurityWarning[];
|
|
40
|
+
export declare function nextjsMiddlewareCoverage(repo: string, options?: NextjsMiddlewareCoverageOptions): Promise<NextjsMiddlewareCoverageResult>;
|
|
41
|
+
//# sourceMappingURL=nextjs-middleware-coverage-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextjs-middleware-coverage-tools.d.ts","sourceRoot":"","sources":["../../src/tools/nextjs-middleware-coverage-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE,WAAW,CAAC;IACtB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,+BAA+B;IAC9C,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;CACnD;AAQD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,EACnC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC,CAgBtB;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,WAAW,EACrB,OAAO,CAAC,EAAE;IAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAAE,GAClD,eAAe,EAAE,CAwBnB;AAMD,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,+BAA+B,GACxC,OAAO,CAAC,8BAA8B,CAAC,CAiCzC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Next.js middleware coverage analyzer (T8).
|
|
3
|
+
*
|
|
4
|
+
* Cross-references the route map (via `nextjsRouteMap`) with the middleware
|
|
5
|
+
* matcher config (via existing `traceMiddleware`) to compute coverage:
|
|
6
|
+
* which routes are protected and which are unprotected. Flags admin routes
|
|
7
|
+
* without middleware as high-severity warnings.
|
|
8
|
+
*/
|
|
9
|
+
import { traceMiddleware } from "../utils/nextjs.js";
|
|
10
|
+
import { getCodeIndex } from "./index-tools.js";
|
|
11
|
+
import { nextjsRouteMap } from "./nextjs-route-tools.js";
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Pure helpers (Tasks 41, 42)
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
const DEFAULT_ADMIN_PREFIXES = ["/admin", "/dashboard"];
|
|
16
|
+
export async function calculateCoverage(routes, repoRoot) {
|
|
17
|
+
const protectedRoutes = [];
|
|
18
|
+
const unprotectedRoutes = [];
|
|
19
|
+
for (const r of routes) {
|
|
20
|
+
const trace = await traceMiddleware(repoRoot, r.url_path);
|
|
21
|
+
if (trace && trace.applies) {
|
|
22
|
+
protectedRoutes.push(r.url_path);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
unprotectedRoutes.push(r.url_path);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
protected: protectedRoutes,
|
|
30
|
+
unprotected: unprotectedRoutes,
|
|
31
|
+
total_routes: routes.length,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export function flagSecurityWarnings(coverage, options) {
|
|
35
|
+
const prefixes = options?.flag_admin_prefix
|
|
36
|
+
? Array.isArray(options.flag_admin_prefix)
|
|
37
|
+
? options.flag_admin_prefix
|
|
38
|
+
: [options.flag_admin_prefix]
|
|
39
|
+
: DEFAULT_ADMIN_PREFIXES;
|
|
40
|
+
const warnings = [];
|
|
41
|
+
for (const route of coverage.unprotected) {
|
|
42
|
+
for (const prefix of prefixes) {
|
|
43
|
+
if (route === prefix || route.startsWith(`${prefix}/`)) {
|
|
44
|
+
warnings.push({
|
|
45
|
+
severity: "high",
|
|
46
|
+
route,
|
|
47
|
+
reason: `admin route without middleware (${prefix} prefix)`,
|
|
48
|
+
});
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Sort by severity desc (high first)
|
|
54
|
+
const order = { high: 3, medium: 2, low: 1 };
|
|
55
|
+
warnings.sort((a, b) => order[b.severity] - order[a.severity]);
|
|
56
|
+
return warnings;
|
|
57
|
+
}
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
// Orchestrator (Task 43a)
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
export async function nextjsMiddlewareCoverage(repo, options) {
|
|
62
|
+
if (process.env.CODESIFT_DISABLE_TOOLS?.includes("nextjs_middleware_coverage")) {
|
|
63
|
+
throw new Error("nextjs_middleware_coverage is disabled via CODESIFT_DISABLE_TOOLS");
|
|
64
|
+
}
|
|
65
|
+
const index = await getCodeIndex(repo);
|
|
66
|
+
if (!index) {
|
|
67
|
+
throw new Error(`Repository not found: ${repo}. Run index_folder first.`);
|
|
68
|
+
}
|
|
69
|
+
const projectRoot = index.root;
|
|
70
|
+
const routeMap = await nextjsRouteMap(repo, options?.workspace ? { workspace: options.workspace } : undefined);
|
|
71
|
+
// Only consider page/route entries for coverage
|
|
72
|
+
const pageRoutes = routeMap.routes.filter((r) => r.type === "page" || r.type === "route");
|
|
73
|
+
const coverage = await calculateCoverage(pageRoutes, projectRoot);
|
|
74
|
+
const warnings = flagSecurityWarnings(coverage, {
|
|
75
|
+
...(options?.flag_admin_prefix !== undefined ? { flag_admin_prefix: options.flag_admin_prefix } : {}),
|
|
76
|
+
});
|
|
77
|
+
return {
|
|
78
|
+
coverage,
|
|
79
|
+
warnings,
|
|
80
|
+
total: coverage.total_routes,
|
|
81
|
+
workspaces_scanned: routeMap.workspaces_scanned,
|
|
82
|
+
limitations: [
|
|
83
|
+
"fail-open behavior on computed matcher (treats as protected)",
|
|
84
|
+
"default admin prefixes: /admin, /dashboard (override with flag_admin_prefix)",
|
|
85
|
+
],
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=nextjs-middleware-coverage-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextjs-middleware-coverage-tools.js","sourceRoot":"","sources":["../../src/tools/nextjs-middleware-coverage-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Next.js route map: enumerate all route files (App Router + Pages Router),
|
|
3
|
+
* classify rendering strategy from route segment config, and detect hybrid
|
|
4
|
+
* conflicts where the same URL is served by both routers.
|
|
5
|
+
*/
|
|
6
|
+
import type Parser from "web-tree-sitter";
|
|
7
|
+
export type RenderingStrategy = "static" | "ssr" | "isr" | "edge" | "client" | "unknown";
|
|
8
|
+
export type RouteEntryType = "page" | "route" | "layout" | "loading" | "error" | "not-found" | "global-error" | "default" | "template" | "parallel" | "intercepting" | "app" | "document" | "error_page";
|
|
9
|
+
export interface RouteSegmentConfig {
|
|
10
|
+
dynamic?: "auto" | "force-dynamic" | "force-static" | "error";
|
|
11
|
+
dynamic_non_literal?: boolean;
|
|
12
|
+
revalidate?: number | false;
|
|
13
|
+
revalidate_non_literal?: boolean;
|
|
14
|
+
runtime?: "nodejs" | "edge";
|
|
15
|
+
runtime_non_literal?: boolean;
|
|
16
|
+
has_generate_static_params: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface NextjsRouteEntry {
|
|
19
|
+
url_path: string;
|
|
20
|
+
file_path: string;
|
|
21
|
+
router: "app" | "pages";
|
|
22
|
+
type: RouteEntryType;
|
|
23
|
+
rendering: RenderingStrategy;
|
|
24
|
+
config: RouteSegmentConfig;
|
|
25
|
+
has_metadata: boolean;
|
|
26
|
+
methods?: string[];
|
|
27
|
+
layout_chain: string[];
|
|
28
|
+
middleware_applies: boolean;
|
|
29
|
+
is_client_component: boolean;
|
|
30
|
+
/** Free-text explanation of *why* a route is SSR. Set only when rendering === "ssr". */
|
|
31
|
+
rendering_reason?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface NextjsRouteConflict {
|
|
34
|
+
url_path: string;
|
|
35
|
+
app: string;
|
|
36
|
+
pages: string;
|
|
37
|
+
}
|
|
38
|
+
export interface NextjsRouteMapResult {
|
|
39
|
+
routes: NextjsRouteEntry[];
|
|
40
|
+
conflicts: NextjsRouteConflict[];
|
|
41
|
+
middleware: {
|
|
42
|
+
file: string;
|
|
43
|
+
matchers: string[];
|
|
44
|
+
} | null;
|
|
45
|
+
workspaces_scanned: string[];
|
|
46
|
+
scan_errors: string[];
|
|
47
|
+
truncated: boolean;
|
|
48
|
+
truncated_at?: number;
|
|
49
|
+
}
|
|
50
|
+
export interface NextjsRouteMapOptions {
|
|
51
|
+
workspace?: string | undefined;
|
|
52
|
+
router?: "app" | "pages" | "both" | undefined;
|
|
53
|
+
include_metadata?: boolean | undefined;
|
|
54
|
+
max_routes?: number | undefined;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Read Next.js route segment config exports from an AST.
|
|
58
|
+
*
|
|
59
|
+
* Recognizes:
|
|
60
|
+
* export const dynamic = "force-dynamic"
|
|
61
|
+
* export const revalidate = 60 | false
|
|
62
|
+
* export const runtime = "edge"
|
|
63
|
+
* export async function generateStaticParams() {...}
|
|
64
|
+
*
|
|
65
|
+
* Non-literal initializers (Identifier, BinaryExpression, etc.) set a
|
|
66
|
+
* `_non_literal` flag and leave the corresponding value `undefined`.
|
|
67
|
+
*
|
|
68
|
+
* @internal exported for unit testing
|
|
69
|
+
*/
|
|
70
|
+
export declare function readRouteSegmentConfig(tree: Parser.Tree, _source: string): RouteSegmentConfig;
|
|
71
|
+
export interface PagesRouterSignals {
|
|
72
|
+
hasGetServerSideProps?: boolean;
|
|
73
|
+
hasGetStaticProps?: boolean;
|
|
74
|
+
hasRevalidateInReturn?: boolean;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Map a route segment config (+ optional Pages Router signals) to a
|
|
78
|
+
* rendering strategy.
|
|
79
|
+
*
|
|
80
|
+
* Priority (App Router): runtime=edge > force-dynamic > force-static >
|
|
81
|
+
* revalidate > generateStaticParams > default (static).
|
|
82
|
+
*
|
|
83
|
+
* Pages Router: getServerSideProps → ssr; getStaticProps + revalidate → isr;
|
|
84
|
+
* getStaticProps → static; otherwise unknown.
|
|
85
|
+
*
|
|
86
|
+
* @internal exported for unit testing
|
|
87
|
+
*/
|
|
88
|
+
export declare function classifyRendering(config: RouteSegmentConfig, router: "app" | "pages", pagesSignals?: PagesRouterSignals): RenderingStrategy;
|
|
89
|
+
/**
|
|
90
|
+
* Process a single route file into a `NextjsRouteEntry`.
|
|
91
|
+
*
|
|
92
|
+
* @internal exported for unit testing
|
|
93
|
+
*/
|
|
94
|
+
export declare function parseRouteFile(filePath: string, repoRoot: string, router: "app" | "pages"): Promise<NextjsRouteEntry>;
|
|
95
|
+
/**
|
|
96
|
+
* Enumerate all Next.js routes (App + Pages Router) with rendering strategy
|
|
97
|
+
* classification and hybrid conflict detection.
|
|
98
|
+
*/
|
|
99
|
+
export declare function nextjsRouteMap(repo: string, options?: NextjsRouteMapOptions): Promise<NextjsRouteMapResult>;
|
|
100
|
+
//# sourceMappingURL=nextjs-route-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextjs-route-tools.d.ts","sourceRoot":"","sources":["../../src/tools/nextjs-route-tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAiB1C,MAAM,MAAM,iBAAiB,GACzB,QAAQ,GACR,KAAK,GACL,KAAK,GACL,MAAM,GACN,QAAQ,GACR,SAAS,CAAC;AAEd,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,OAAO,GACP,QAAQ,GACR,SAAS,GACT,OAAO,GACP,WAAW,GACX,cAAc,GACd,SAAS,GACT,UAAU,GACV,UAAU,GACV,cAAc,GACd,KAAK,GACL,UAAU,GACV,YAAY,CAAC;AAEjB,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,cAAc,GAAG,OAAO,CAAC;IAC9D,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC5B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,OAAO,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,0BAA0B,EAAE,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,KAAK,GAAG,OAAO,CAAC;IACxB,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,wFAAwF;IACxF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IACxD,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,MAAM,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IAC9C,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAmBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,CAAC,IAAI,EACjB,OAAO,EAAE,MAAM,GACd,kBAAkB,CA4BpB;AAkDD,MAAM,WAAW,kBAAkB;IACjC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,kBAAkB,EAC1B,MAAM,EAAE,KAAK,GAAG,OAAO,EACvB,YAAY,CAAC,EAAE,kBAAkB,GAChC,iBAAiB,CAkBnB;AAyFD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,KAAK,GAAG,OAAO,GACtB,OAAO,CAAC,gBAAgB,CAAC,CA2G3B;AAgBD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,oBAAoB,CAAC,CAoJ/B"}
|