codesift-mcp 0.3.0 → 0.5.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 +215 -23
- 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/help.d.ts.map +1 -1
- package/dist/cli/help.js +8 -6
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/platform.d.ts.map +1 -1
- package/dist/cli/platform.js +12 -14
- package/dist/cli/platform.js.map +1 -1
- package/dist/cli/setup.d.ts +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +27 -3
- 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 +521 -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 +39 -38
- 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 +334 -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 +209 -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/parse-cache.d.ts +39 -0
- package/dist/parser/parse-cache.d.ts.map +1 -0
- package/dist/parser/parse-cache.js +87 -0
- package/dist/parser/parse-cache.js.map +1 -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 +93 -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 +38 -2
- package/dist/register-tools.d.ts.map +1 -1
- package/dist/register-tools.js +2444 -195
- 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/search/tool-ranker.d.ts +90 -0
- package/dist/search/tool-ranker.d.ts.map +1 -0
- package/dist/search/tool-ranker.js +420 -0
- package/dist/search/tool-ranker.js.map +1 -0
- 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 +47 -14
- 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/storage/usage-tracker.d.ts.map +1 -1
- package/dist/storage/usage-tracker.js +4 -1
- package/dist/storage/usage-tracker.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-actions.d.ts +54 -0
- package/dist/tools/astro-actions.d.ts.map +1 -0
- package/dist/tools/astro-actions.js +561 -0
- package/dist/tools/astro-actions.js.map +1 -0
- package/dist/tools/astro-audit.d.ts +87 -0
- package/dist/tools/astro-audit.d.ts.map +1 -0
- package/dist/tools/astro-audit.js +345 -0
- package/dist/tools/astro-audit.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-content-collections.d.ts +44 -0
- package/dist/tools/astro-content-collections.d.ts.map +1 -0
- package/dist/tools/astro-content-collections.js +630 -0
- package/dist/tools/astro-content-collections.js.map +1 -0
- package/dist/tools/astro-islands.d.ts +63 -0
- package/dist/tools/astro-islands.d.ts.map +1 -0
- package/dist/tools/astro-islands.js +255 -0
- package/dist/tools/astro-islands.js.map +1 -0
- package/dist/tools/astro-migration.d.ts +31 -0
- package/dist/tools/astro-migration.d.ts.map +1 -0
- package/dist/tools/astro-migration.js +378 -0
- package/dist/tools/astro-migration.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/async-correctness.d.ts +26 -0
- package/dist/tools/async-correctness.d.ts.map +1 -0
- package/dist/tools/async-correctness.js +166 -0
- package/dist/tools/async-correctness.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/django-view-security-tools.d.ts +32 -0
- package/dist/tools/django-view-security-tools.d.ts.map +1 -0
- package/dist/tools/django-view-security-tools.js +184 -0
- package/dist/tools/django-view-security-tools.js.map +1 -0
- package/dist/tools/fastapi-depends.d.ts +63 -0
- package/dist/tools/fastapi-depends.d.ts.map +1 -0
- package/dist/tools/fastapi-depends.js +191 -0
- package/dist/tools/fastapi-depends.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 +94 -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 +112 -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 +70 -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 +102 -0
- package/dist/tools/hono-dead-routes.js.map +1 -0
- package/dist/tools/hono-entry-resolver.d.ts +27 -0
- package/dist/tools/hono-entry-resolver.d.ts.map +1 -0
- package/dist/tools/hono-entry-resolver.js +31 -0
- package/dist/tools/hono-entry-resolver.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 +59 -0
- package/dist/tools/hono-inline-analyze.js.map +1 -0
- package/dist/tools/hono-middleware-chain.d.ts +40 -0
- package/dist/tools/hono-middleware-chain.d.ts.map +1 -0
- package/dist/tools/hono-middleware-chain.js +121 -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 +118 -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 +76 -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 +49 -0
- package/dist/tools/hono-rpc-types.js.map +1 -0
- package/dist/tools/hono-security.d.ts +31 -0
- package/dist/tools/hono-security.d.ts.map +1 -0
- package/dist/tools/hono-security.js +269 -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 +64 -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 +207 -0
- package/dist/tools/nest-ext-tools.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools.js +752 -0
- package/dist/tools/nest-ext-tools.js.map +1 -0
- package/dist/tools/nest-tools.d.ts +198 -0
- package/dist/tools/nest-tools.d.ts.map +1 -0
- package/dist/tools/nest-tools.js +1142 -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-readers.d.ts +101 -0
- package/dist/tools/nextjs-component-readers.d.ts.map +1 -0
- package/dist/tools/nextjs-component-readers.js +287 -0
- package/dist/tools/nextjs-component-readers.js.map +1 -0
- package/dist/tools/nextjs-component-tools.d.ts +51 -0
- package/dist/tools/nextjs-component-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-component-tools.js +212 -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 +60 -0
- package/dist/tools/nextjs-framework-audit-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-framework-audit-tools.js +394 -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-readers.d.ts +81 -0
- package/dist/tools/nextjs-route-readers.d.ts.map +1 -0
- package/dist/tools/nextjs-route-readers.js +340 -0
- package/dist/tools/nextjs-route-readers.js.map +1 -0
- package/dist/tools/nextjs-route-tools.d.ts +36 -0
- package/dist/tools/nextjs-route-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-route-tools.js +175 -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 +651 -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 +185 -0
- package/dist/tools/php-tools.d.ts.map +1 -0
- package/dist/tools/php-tools.js +645 -0
- package/dist/tools/php-tools.js.map +1 -0
- package/dist/tools/plan-turn-tools.d.ts +89 -0
- package/dist/tools/plan-turn-tools.d.ts.map +1 -0
- package/dist/tools/plan-turn-tools.js +508 -0
- package/dist/tools/plan-turn-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 +116 -7
- package/dist/tools/project-tools.d.ts.map +1 -1
- package/dist/tools/project-tools.js +595 -218
- package/dist/tools/project-tools.js.map +1 -1
- package/dist/tools/pydantic-models.d.ts +46 -0
- package/dist/tools/pydantic-models.d.ts.map +1 -0
- package/dist/tools/pydantic-models.js +249 -0
- package/dist/tools/pydantic-models.js.map +1 -0
- 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-audit.d.ts +40 -0
- package/dist/tools/python-audit.d.ts.map +1 -0
- package/dist/tools/python-audit.js +244 -0
- package/dist/tools/python-audit.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-constants-tools.d.ts +44 -0
- package/dist/tools/python-constants-tools.d.ts.map +1 -0
- package/dist/tools/python-constants-tools.js +525 -0
- package/dist/tools/python-constants-tools.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 +263 -0
- package/dist/tools/react-tools.d.ts.map +1 -0
- package/dist/tools/react-tools.js +839 -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 +5 -4
- package/dist/tools/review-diff-tools.d.ts.map +1 -1
- package/dist/tools/review-diff-tools.js +157 -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/search-tools.d.ts +3 -2
- package/dist/tools/search-tools.d.ts.map +1 -1
- package/dist/tools/search-tools.js +16 -3
- package/dist/tools/search-tools.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 +274 -0
- package/dist/tools/sql-tools.d.ts.map +1 -0
- package/dist/tools/sql-tools.js +1160 -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 +75 -4
- package/dist/tools/symbol-tools.js.map +1 -1
- package/dist/tools/taint-tools.d.ts +43 -0
- package/dist/tools/taint-tools.d.ts.map +1 -0
- package/dist/tools/taint-tools.js +922 -0
- package/dist/tools/taint-tools.js.map +1 -0
- 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 +42 -0
- package/dist/utils/import-graph.d.ts.map +1 -1
- package/dist/utils/import-graph.js +248 -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 +4 -3
- package/rules/codesift.md +71 -5
- package/rules/codesift.mdc +71 -5
- package/rules/codex.md +71 -5
- package/rules/gemini.md +71 -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,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* analyze_inline_handler — returns structured body analysis for a specific
|
|
3
|
+
* inline handler. Consumes HonoRoute.inline_analysis populated by T3.
|
|
4
|
+
*
|
|
5
|
+
* Closes blog API demo gap #1: all 7 blog routes are (c) => c.json(...) inline
|
|
6
|
+
* arrows, and Phase 1 reported them as opaque "<inline>" handlers with zero
|
|
7
|
+
* introspection. With this tool, callers can ask "what does GET /users/:id do?"
|
|
8
|
+
* and get responses, errors, DB calls, fetch calls, context access, and
|
|
9
|
+
* validators — all statically extracted.
|
|
10
|
+
*
|
|
11
|
+
* Spec: docs/specs/2026-04-11-hono-phase-2-plan.md (T8)
|
|
12
|
+
*/
|
|
13
|
+
import { getCodeIndex } from "./index-tools.js";
|
|
14
|
+
import { honoCache } from "../cache/hono-cache.js";
|
|
15
|
+
import { HonoExtractor } from "../parser/extractors/hono.js";
|
|
16
|
+
import { resolveHonoEntryFile } from "./hono-entry-resolver.js";
|
|
17
|
+
import { detectFrameworks } from "../utils/framework-detect.js";
|
|
18
|
+
/**
|
|
19
|
+
* @param repo repository identifier
|
|
20
|
+
* @param method optional HTTP method filter (e.g. "GET"); case-insensitive
|
|
21
|
+
* @param path optional path filter (e.g. "/users/:id"); exact match
|
|
22
|
+
*/
|
|
23
|
+
export async function analyzeInlineHandler(repo, method, routePath) {
|
|
24
|
+
const index = await getCodeIndex(repo);
|
|
25
|
+
if (!index)
|
|
26
|
+
return { error: `Repository "${repo}" not found` };
|
|
27
|
+
const frameworks = detectFrameworks(index);
|
|
28
|
+
if (!frameworks.has("hono"))
|
|
29
|
+
return { error: "No Hono app detected" };
|
|
30
|
+
const entryFile = resolveHonoEntryFile(index);
|
|
31
|
+
if (!entryFile)
|
|
32
|
+
return { error: "No Hono app entry file found" };
|
|
33
|
+
let model;
|
|
34
|
+
try {
|
|
35
|
+
model = await honoCache.get(repo, entryFile, new HonoExtractor());
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
39
|
+
return { error: `Failed to parse: ${msg}` };
|
|
40
|
+
}
|
|
41
|
+
const methodFilter = method?.toUpperCase();
|
|
42
|
+
const reports = [];
|
|
43
|
+
for (const route of model.routes) {
|
|
44
|
+
if (!route.inline_analysis)
|
|
45
|
+
continue;
|
|
46
|
+
if (methodFilter && route.method !== methodFilter)
|
|
47
|
+
continue;
|
|
48
|
+
if (routePath && route.path !== routePath)
|
|
49
|
+
continue;
|
|
50
|
+
reports.push({
|
|
51
|
+
route: `${route.method} ${route.path}`,
|
|
52
|
+
file: route.file,
|
|
53
|
+
line: route.line,
|
|
54
|
+
analysis: route.inline_analysis,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return { reports, total: reports.length };
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=hono-inline-analyze.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono-inline-analyze.js","sourceRoot":"","sources":["../../src/tools/hono-inline-analyze.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAgBhE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAY,EACZ,MAAe,EACf,SAAkB;IAElB,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,eAAe,IAAI,aAAa,EAAE,CAAC;IAE/D,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;IAEtE,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC;IAEjE,IAAI,KAAK,CAAC;IACV,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,aAAa,EAAE,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,EAAE,KAAK,EAAE,oBAAoB,GAAG,EAAE,EAAE,CAAC;IAC9C,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,EAAE,WAAW,EAAE,CAAC;IAC3C,MAAM,OAAO,GAA0B,EAAE,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,IAAI,CAAC,KAAK,CAAC,eAAe;YAAE,SAAS;QACrC,IAAI,YAAY,IAAI,KAAK,CAAC,MAAM,KAAK,YAAY;YAAE,SAAS;QAC5D,IAAI,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;YAAE,SAAS;QACpD,OAAO,CAAC,IAAI,CAAC;YACX,KAAK,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE;YACtC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,QAAQ,EAAE,KAAK,CAAC,eAAe;SAChC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* trace_middleware_chain — middleware chain introspection.
|
|
3
|
+
*
|
|
4
|
+
* Three query modes (mutually exclusive):
|
|
5
|
+
* 1. Route mode — path + optional method → ordered chain effective for that route
|
|
6
|
+
* 2. Scope mode — scope literal (e.g. "/posts/*") → chain of that specific app.use
|
|
7
|
+
* 3. App-wide mode — no path, no scope → flattened entries from every chain
|
|
8
|
+
*
|
|
9
|
+
* Any mode supports `only_conditional: true` to filter entries down to those
|
|
10
|
+
* whose `applied_when` field is populated (Phase 2 T4 conditional middleware
|
|
11
|
+
* detection). This absorbs the former standalone `trace_conditional_middleware`
|
|
12
|
+
* tool — a scope-filtered or app-wide query with only_conditional=true is
|
|
13
|
+
* equivalent to the old tool's output.
|
|
14
|
+
*
|
|
15
|
+
* Spec: docs/specs/2026-04-10-hono-framework-intelligence-spec.md (Task 16) +
|
|
16
|
+
* docs/specs/2026-04-11-hono-phase-2-plan.md (T7 consolidation)
|
|
17
|
+
*/
|
|
18
|
+
import type { MiddlewareEntry } from "../parser/extractors/hono-model.js";
|
|
19
|
+
export interface MiddlewareChainOptions {
|
|
20
|
+
/** Filter to a specific middleware scope literal (e.g. "/posts/*"). */
|
|
21
|
+
scope?: string;
|
|
22
|
+
/** Return only entries whose applied_when field is populated. */
|
|
23
|
+
only_conditional?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface MiddlewareChainResult {
|
|
26
|
+
/** Present only in route mode — describes the route that was looked up. */
|
|
27
|
+
route?: {
|
|
28
|
+
method: string;
|
|
29
|
+
path: string;
|
|
30
|
+
file: string;
|
|
31
|
+
line: number;
|
|
32
|
+
};
|
|
33
|
+
/** Present only in scope / app-wide modes — the middleware scope(s) walked. */
|
|
34
|
+
scopes?: string[];
|
|
35
|
+
chain: MiddlewareEntry[];
|
|
36
|
+
total: number;
|
|
37
|
+
error?: string;
|
|
38
|
+
}
|
|
39
|
+
export declare function traceMiddlewareChain(repo: string, path?: string, method?: string, options?: MiddlewareChainOptions): Promise<MiddlewareChainResult>;
|
|
40
|
+
//# sourceMappingURL=hono-middleware-chain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono-middleware-chain.d.ts","sourceRoot":"","sources":["../../src/tools/hono-middleware-chain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAQH,OAAO,KAAK,EAAE,eAAe,EAAa,MAAM,oCAAoC,CAAC;AAErF,MAAM,WAAW,sBAAsB;IACrC,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,2EAA2E;IAC3E,KAAK,CAAC,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,qBAAqB,CAAC,CAiGhC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* trace_middleware_chain — middleware chain introspection.
|
|
3
|
+
*
|
|
4
|
+
* Three query modes (mutually exclusive):
|
|
5
|
+
* 1. Route mode — path + optional method → ordered chain effective for that route
|
|
6
|
+
* 2. Scope mode — scope literal (e.g. "/posts/*") → chain of that specific app.use
|
|
7
|
+
* 3. App-wide mode — no path, no scope → flattened entries from every chain
|
|
8
|
+
*
|
|
9
|
+
* Any mode supports `only_conditional: true` to filter entries down to those
|
|
10
|
+
* whose `applied_when` field is populated (Phase 2 T4 conditional middleware
|
|
11
|
+
* detection). This absorbs the former standalone `trace_conditional_middleware`
|
|
12
|
+
* tool — a scope-filtered or app-wide query with only_conditional=true is
|
|
13
|
+
* equivalent to the old tool's output.
|
|
14
|
+
*
|
|
15
|
+
* Spec: docs/specs/2026-04-10-hono-framework-intelligence-spec.md (Task 16) +
|
|
16
|
+
* docs/specs/2026-04-11-hono-phase-2-plan.md (T7 consolidation)
|
|
17
|
+
*/
|
|
18
|
+
import { getCodeIndex } from "./index-tools.js";
|
|
19
|
+
import { honoCache } from "../cache/hono-cache.js";
|
|
20
|
+
import { HonoExtractor } from "../parser/extractors/hono.js";
|
|
21
|
+
import { resolveHonoEntryFile } from "./hono-entry-resolver.js";
|
|
22
|
+
import { matchPath } from "./route-tools.js";
|
|
23
|
+
import { detectFrameworks } from "../utils/framework-detect.js";
|
|
24
|
+
export async function traceMiddlewareChain(repo, path, method, options) {
|
|
25
|
+
const index = await getCodeIndex(repo);
|
|
26
|
+
if (!index) {
|
|
27
|
+
return { chain: [], total: 0, error: `Repository "${repo}" not found` };
|
|
28
|
+
}
|
|
29
|
+
const frameworks = detectFrameworks(index);
|
|
30
|
+
if (!frameworks.has("hono")) {
|
|
31
|
+
return { chain: [], total: 0, error: "No Hono app detected in this repo" };
|
|
32
|
+
}
|
|
33
|
+
const entryFile = resolveHonoEntryFile(index);
|
|
34
|
+
if (!entryFile) {
|
|
35
|
+
return { chain: [], total: 0, error: "No Hono app entry file found" };
|
|
36
|
+
}
|
|
37
|
+
let model;
|
|
38
|
+
try {
|
|
39
|
+
model = await honoCache.get(repo, entryFile, new HonoExtractor());
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
43
|
+
return { chain: [], total: 0, error: `Failed to parse Hono app: ${msg}` };
|
|
44
|
+
}
|
|
45
|
+
const onlyConditional = options?.only_conditional === true;
|
|
46
|
+
const scopeFilter = options?.scope;
|
|
47
|
+
// ── Route mode ──────────────────────────────────────────────────────────
|
|
48
|
+
if (path !== undefined) {
|
|
49
|
+
const upperMethod = method?.toUpperCase();
|
|
50
|
+
const matchingRoute = model.routes.find((r) => matchPath(r.path, path) && (!upperMethod || r.method === upperMethod));
|
|
51
|
+
if (!matchingRoute) {
|
|
52
|
+
return {
|
|
53
|
+
chain: [],
|
|
54
|
+
total: 0,
|
|
55
|
+
error: `No route matching ${method ?? "ANY"} ${path}`,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const entries = [];
|
|
59
|
+
for (const mc of model.middleware_chains) {
|
|
60
|
+
const pattern = compileScopePattern(mc.scope_pattern);
|
|
61
|
+
if (pattern.test(matchingRoute.path)) {
|
|
62
|
+
entries.push(...mc.entries);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
entries.sort((a, b) => a.order - b.order);
|
|
66
|
+
const filtered = onlyConditional
|
|
67
|
+
? entries.filter((e) => e.applied_when !== undefined)
|
|
68
|
+
: entries;
|
|
69
|
+
return {
|
|
70
|
+
route: {
|
|
71
|
+
method: matchingRoute.method,
|
|
72
|
+
path: matchingRoute.path,
|
|
73
|
+
file: matchingRoute.file,
|
|
74
|
+
line: matchingRoute.line,
|
|
75
|
+
},
|
|
76
|
+
chain: filtered,
|
|
77
|
+
total: filtered.length,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
// ── Scope mode ──────────────────────────────────────────────────────────
|
|
81
|
+
if (scopeFilter !== undefined) {
|
|
82
|
+
const chains = model.middleware_chains.filter((mc) => mc.scope === scopeFilter);
|
|
83
|
+
const entries = chains.flatMap((mc) => mc.entries);
|
|
84
|
+
entries.sort((a, b) => a.order - b.order);
|
|
85
|
+
const filtered = onlyConditional
|
|
86
|
+
? entries.filter((e) => e.applied_when !== undefined)
|
|
87
|
+
: entries;
|
|
88
|
+
return {
|
|
89
|
+
scopes: chains.map((mc) => mc.scope),
|
|
90
|
+
chain: filtered,
|
|
91
|
+
total: filtered.length,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// ── App-wide mode ───────────────────────────────────────────────────────
|
|
95
|
+
const allEntries = [];
|
|
96
|
+
const allScopes = [];
|
|
97
|
+
for (const mc of model.middleware_chains) {
|
|
98
|
+
allScopes.push(mc.scope);
|
|
99
|
+
allEntries.push(...mc.entries);
|
|
100
|
+
}
|
|
101
|
+
allEntries.sort((a, b) => a.order - b.order);
|
|
102
|
+
const filtered = onlyConditional
|
|
103
|
+
? allEntries.filter((e) => e.applied_when !== undefined)
|
|
104
|
+
: allEntries;
|
|
105
|
+
return {
|
|
106
|
+
scopes: allScopes,
|
|
107
|
+
chain: filtered,
|
|
108
|
+
total: filtered.length,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function compileScopePattern(pattern) {
|
|
112
|
+
// Simple glob→regex: * matches anything (non-greedy-ish for path segments)
|
|
113
|
+
// Handle bare "*" as "match anything"
|
|
114
|
+
if (pattern === "*")
|
|
115
|
+
return /^.*$/;
|
|
116
|
+
// Escape regex metachars EXCEPT *, then replace * with .*
|
|
117
|
+
const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, "\\$&");
|
|
118
|
+
const regexStr = escaped.replace(/\*/g, ".*");
|
|
119
|
+
return new RegExp(`^${regexStr}$`);
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=hono-middleware-chain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono-middleware-chain.js","sourceRoot":"","sources":["../../src/tools/hono-middleware-chain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* detect_hono_modules — clusters routes into logical modules without any new
|
|
3
|
+
* AST walking. Uses the 2-segment path prefix as the clustering key (e.g.,
|
|
4
|
+
* /api/admin/users → /api/admin), then rolls up middleware, env bindings,
|
|
5
|
+
* and source files per group. Single-segment routes cluster on the first
|
|
6
|
+
* segment alone.
|
|
7
|
+
*
|
|
8
|
+
* Closes Hono GitHub Issue #4121 — there is no existing architecture
|
|
9
|
+
* guidance for enterprise Hono apps with multiple logical modules. This
|
|
10
|
+
* tool surfaces the implicit module structure already encoded in path
|
|
11
|
+
* prefixes and shared middleware.
|
|
12
|
+
*
|
|
13
|
+
* Spec: docs/specs/2026-04-11-hono-phase-2-plan.md (T11)
|
|
14
|
+
*/
|
|
15
|
+
import type { HonoModule } from "../parser/extractors/hono-model.js";
|
|
16
|
+
export interface HonoModulesResult {
|
|
17
|
+
modules?: HonoModule[];
|
|
18
|
+
total?: number;
|
|
19
|
+
error?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function detectHonoModules(repo: string): Promise<HonoModulesResult>;
|
|
22
|
+
//# sourceMappingURL=hono-modules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono-modules.d.ts","sourceRoot":"","sources":["../../src/tools/hono-modules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAErE,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,iBAAiB,CAAC,CA0E5B"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* detect_hono_modules — clusters routes into logical modules without any new
|
|
3
|
+
* AST walking. Uses the 2-segment path prefix as the clustering key (e.g.,
|
|
4
|
+
* /api/admin/users → /api/admin), then rolls up middleware, env bindings,
|
|
5
|
+
* and source files per group. Single-segment routes cluster on the first
|
|
6
|
+
* segment alone.
|
|
7
|
+
*
|
|
8
|
+
* Closes Hono GitHub Issue #4121 — there is no existing architecture
|
|
9
|
+
* guidance for enterprise Hono apps with multiple logical modules. This
|
|
10
|
+
* tool surfaces the implicit module structure already encoded in path
|
|
11
|
+
* prefixes and shared middleware.
|
|
12
|
+
*
|
|
13
|
+
* Spec: docs/specs/2026-04-11-hono-phase-2-plan.md (T11)
|
|
14
|
+
*/
|
|
15
|
+
import { getCodeIndex } from "./index-tools.js";
|
|
16
|
+
import { honoCache } from "../cache/hono-cache.js";
|
|
17
|
+
import { HonoExtractor } from "../parser/extractors/hono.js";
|
|
18
|
+
import { resolveHonoEntryFile } from "./hono-entry-resolver.js";
|
|
19
|
+
import { detectFrameworks } from "../utils/framework-detect.js";
|
|
20
|
+
export async function detectHonoModules(repo) {
|
|
21
|
+
const index = await getCodeIndex(repo);
|
|
22
|
+
if (!index)
|
|
23
|
+
return { error: `Repository "${repo}" not found` };
|
|
24
|
+
const frameworks = detectFrameworks(index);
|
|
25
|
+
if (!frameworks.has("hono"))
|
|
26
|
+
return { error: "No Hono app detected" };
|
|
27
|
+
const entryFile = resolveHonoEntryFile(index);
|
|
28
|
+
if (!entryFile)
|
|
29
|
+
return { error: "No Hono app entry file found" };
|
|
30
|
+
let model;
|
|
31
|
+
try {
|
|
32
|
+
model = await honoCache.get(repo, entryFile, new HonoExtractor());
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
36
|
+
return { error: `Failed to parse: ${msg}` };
|
|
37
|
+
}
|
|
38
|
+
// Bucket routes by module prefix.
|
|
39
|
+
const buckets = new Map();
|
|
40
|
+
for (const route of model.routes) {
|
|
41
|
+
const prefix = modulePrefix(route.path);
|
|
42
|
+
let bucket = buckets.get(prefix);
|
|
43
|
+
if (!bucket) {
|
|
44
|
+
bucket = { routes: [], files: new Set(), bindings: new Set() };
|
|
45
|
+
buckets.set(prefix, bucket);
|
|
46
|
+
}
|
|
47
|
+
bucket.routes.push(`${route.method} ${route.path}`);
|
|
48
|
+
bucket.files.add(route.file);
|
|
49
|
+
// Collect env bindings referenced from the route's inline handler
|
|
50
|
+
if (route.inline_analysis) {
|
|
51
|
+
for (const access of route.inline_analysis.context_access) {
|
|
52
|
+
if (access.type === "env")
|
|
53
|
+
bucket.bindings.add(access.key);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Roll up middleware from chains whose scope pattern matches any route
|
|
58
|
+
// in the module. Scope matching is a simple glob-to-regex conversion.
|
|
59
|
+
const modules = [];
|
|
60
|
+
for (const [prefix, bucket] of buckets) {
|
|
61
|
+
const mwNames = new Set();
|
|
62
|
+
for (const chain of model.middleware_chains) {
|
|
63
|
+
const pattern = scopeToRegex(chain.scope);
|
|
64
|
+
const anyMatch = bucket.routes.some((r) => {
|
|
65
|
+
const path = r.split(" ")[1] ?? "";
|
|
66
|
+
return pattern.test(path);
|
|
67
|
+
});
|
|
68
|
+
if (anyMatch) {
|
|
69
|
+
for (const entry of chain.entries) {
|
|
70
|
+
if (entry.name !== "<inline>")
|
|
71
|
+
mwNames.add(entry.name);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
modules.push({
|
|
76
|
+
name: moduleNameFromPrefix(prefix),
|
|
77
|
+
routes: bucket.routes.sort(),
|
|
78
|
+
middleware: [...mwNames].sort(),
|
|
79
|
+
bindings: [...bucket.bindings].sort(),
|
|
80
|
+
path_prefix: prefix,
|
|
81
|
+
files: [...bucket.files].sort(),
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
modules.sort((a, b) => a.name.localeCompare(b.name));
|
|
85
|
+
return { modules, total: modules.length };
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Compute the module prefix from a route path. Takes the first two
|
|
89
|
+
* non-empty segments so `/api/admin/users/:id` → `/api/admin`, and
|
|
90
|
+
* `/health` → `/health`. Single-segment paths become their own module.
|
|
91
|
+
*/
|
|
92
|
+
function modulePrefix(routePath) {
|
|
93
|
+
const segments = routePath.split("/").filter((s) => s.length > 0);
|
|
94
|
+
if (segments.length === 0)
|
|
95
|
+
return "/";
|
|
96
|
+
if (segments.length === 1)
|
|
97
|
+
return `/${segments[0]}`;
|
|
98
|
+
return `/${segments[0]}/${segments[1]}`;
|
|
99
|
+
}
|
|
100
|
+
function moduleNameFromPrefix(prefix) {
|
|
101
|
+
const cleaned = prefix.replace(/^\//, "").replace(/\//g, "-");
|
|
102
|
+
return cleaned.length > 0 ? cleaned : "root";
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Convert a middleware scope like "/api/admin/*" into a regex. "*" inside a
|
|
106
|
+
* path segment maps to "[^/]*"; a trailing "/*" means "anything under this
|
|
107
|
+
* prefix", so it maps to ".*". Bare "*" means global.
|
|
108
|
+
*/
|
|
109
|
+
function scopeToRegex(scope) {
|
|
110
|
+
if (scope === "*")
|
|
111
|
+
return /^.*$/;
|
|
112
|
+
const escaped = scope
|
|
113
|
+
.replace(/[.+?^${}()|[\]\\]/g, "\\$&")
|
|
114
|
+
.replace(/\/\*$/, "/.*")
|
|
115
|
+
.replace(/\*/g, "[^/]*");
|
|
116
|
+
return new RegExp(`^${escaped}$`);
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=hono-modules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono-modules.js","sourceRoot":"","sources":["../../src/tools/hono-modules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* extract_response_types — aggregates all statically-knowable response types
|
|
3
|
+
* (status code + body shape hint + error classes) per route. Closes Hono
|
|
4
|
+
* GitHub Issue #4270: error response types are not inferrable by RPC clients
|
|
5
|
+
* so client-side type narrowing silently drops them. This tool surfaces them
|
|
6
|
+
* from the inline_analysis data so callers can generate RPC client types
|
|
7
|
+
* that include error paths.
|
|
8
|
+
*
|
|
9
|
+
* Spec: docs/specs/2026-04-11-hono-phase-2-plan.md (T9)
|
|
10
|
+
*/
|
|
11
|
+
export interface ResponseTypeEntry {
|
|
12
|
+
status: number;
|
|
13
|
+
kind: "json" | "text" | "html" | "body" | "redirect" | "newResponse";
|
|
14
|
+
shape_hint?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface ErrorTypeEntry {
|
|
17
|
+
status: number;
|
|
18
|
+
exception_class: string;
|
|
19
|
+
message_hint?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface RouteResponseTypes {
|
|
22
|
+
route: string;
|
|
23
|
+
file: string;
|
|
24
|
+
line: number;
|
|
25
|
+
responses: ResponseTypeEntry[];
|
|
26
|
+
errors: ErrorTypeEntry[];
|
|
27
|
+
/** Distinct status codes reachable (union of responses + errors). */
|
|
28
|
+
status_codes: number[];
|
|
29
|
+
}
|
|
30
|
+
export interface ResponseTypesResult {
|
|
31
|
+
routes?: RouteResponseTypes[];
|
|
32
|
+
total_routes?: number;
|
|
33
|
+
total_statuses?: number;
|
|
34
|
+
error?: string;
|
|
35
|
+
}
|
|
36
|
+
export declare function extractResponseTypes(repo: string): Promise<ResponseTypesResult>;
|
|
37
|
+
//# sourceMappingURL=hono-response-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono-response-types.d.ts","sourceRoot":"","sources":["../../src/tools/hono-response-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,aAAa,CAAC;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,qEAAqE;IACrE,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,mBAAmB,CAAC,CAwD9B"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* extract_response_types — aggregates all statically-knowable response types
|
|
3
|
+
* (status code + body shape hint + error classes) per route. Closes Hono
|
|
4
|
+
* GitHub Issue #4270: error response types are not inferrable by RPC clients
|
|
5
|
+
* so client-side type narrowing silently drops them. This tool surfaces them
|
|
6
|
+
* from the inline_analysis data so callers can generate RPC client types
|
|
7
|
+
* that include error paths.
|
|
8
|
+
*
|
|
9
|
+
* Spec: docs/specs/2026-04-11-hono-phase-2-plan.md (T9)
|
|
10
|
+
*/
|
|
11
|
+
import { getCodeIndex } from "./index-tools.js";
|
|
12
|
+
import { honoCache } from "../cache/hono-cache.js";
|
|
13
|
+
import { HonoExtractor } from "../parser/extractors/hono.js";
|
|
14
|
+
import { resolveHonoEntryFile } from "./hono-entry-resolver.js";
|
|
15
|
+
import { detectFrameworks } from "../utils/framework-detect.js";
|
|
16
|
+
export async function extractResponseTypes(repo) {
|
|
17
|
+
const index = await getCodeIndex(repo);
|
|
18
|
+
if (!index)
|
|
19
|
+
return { error: `Repository "${repo}" not found` };
|
|
20
|
+
const frameworks = detectFrameworks(index);
|
|
21
|
+
if (!frameworks.has("hono"))
|
|
22
|
+
return { error: "No Hono app detected" };
|
|
23
|
+
const entryFile = resolveHonoEntryFile(index);
|
|
24
|
+
if (!entryFile)
|
|
25
|
+
return { error: "No Hono app entry file found" };
|
|
26
|
+
let model;
|
|
27
|
+
try {
|
|
28
|
+
model = await honoCache.get(repo, entryFile, new HonoExtractor());
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
32
|
+
return { error: `Failed to parse: ${msg}` };
|
|
33
|
+
}
|
|
34
|
+
const routes = [];
|
|
35
|
+
const allStatuses = new Set();
|
|
36
|
+
for (const route of model.routes) {
|
|
37
|
+
if (!route.inline_analysis)
|
|
38
|
+
continue;
|
|
39
|
+
const responses = route.inline_analysis.responses.map((r) => {
|
|
40
|
+
const entry = { status: r.status, kind: r.kind };
|
|
41
|
+
if (r.shape_hint !== undefined)
|
|
42
|
+
entry.shape_hint = r.shape_hint;
|
|
43
|
+
return entry;
|
|
44
|
+
});
|
|
45
|
+
const errors = route.inline_analysis.errors.map((e) => {
|
|
46
|
+
const entry = {
|
|
47
|
+
status: e.status,
|
|
48
|
+
exception_class: e.exception_class,
|
|
49
|
+
};
|
|
50
|
+
if (e.message_hint !== undefined)
|
|
51
|
+
entry.message_hint = e.message_hint;
|
|
52
|
+
return entry;
|
|
53
|
+
});
|
|
54
|
+
const statusSet = new Set();
|
|
55
|
+
for (const r of responses)
|
|
56
|
+
statusSet.add(r.status);
|
|
57
|
+
for (const e of errors)
|
|
58
|
+
statusSet.add(e.status);
|
|
59
|
+
for (const s of statusSet)
|
|
60
|
+
allStatuses.add(s);
|
|
61
|
+
routes.push({
|
|
62
|
+
route: `${route.method} ${route.path}`,
|
|
63
|
+
file: route.file,
|
|
64
|
+
line: route.line,
|
|
65
|
+
responses,
|
|
66
|
+
errors,
|
|
67
|
+
status_codes: [...statusSet].sort((a, b) => a - b),
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
routes,
|
|
72
|
+
total_routes: routes.length,
|
|
73
|
+
total_statuses: allStatuses.size,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=hono-response-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono-response-types.js","sourceRoot":"","sources":["../../src/tools/hono-response-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AA+BhE,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAY;IAEZ,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,eAAe,IAAI,aAAa,EAAE,CAAC;IAE/D,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;IAEtE,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC;IAEjE,IAAI,KAAK,CAAC;IACV,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,aAAa,EAAE,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,EAAE,KAAK,EAAE,oBAAoB,GAAG,EAAE,EAAE,CAAC;IAC9C,CAAC;IAED,MAAM,MAAM,GAAyB,EAAE,CAAC;IACxC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IAEtC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,IAAI,CAAC,KAAK,CAAC,eAAe;YAAE,SAAS;QACrC,MAAM,SAAS,GAAwB,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC/E,MAAM,KAAK,GAAsB,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACpE,IAAI,CAAC,CAAC,UAAU,KAAK,SAAS;gBAAE,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;YAChE,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,GAAqB,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACtE,MAAM,KAAK,GAAmB;gBAC5B,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,eAAe,EAAE,CAAC,CAAC,eAAe;aACnC,CAAC;YACF,IAAI,CAAC,CAAC,YAAY,KAAK,SAAS;gBAAE,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC;YACtE,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QACpC,KAAK,MAAM,CAAC,IAAI,SAAS;YAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACnD,KAAK,MAAM,CAAC,IAAI,MAAM;YAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAChD,KAAK,MAAM,CAAC,IAAI,SAAS;YAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAE9C,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE;YACtC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,SAAS;YACT,MAAM;YACN,YAAY,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;SACnD,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,MAAM;QACN,YAAY,EAAE,MAAM,CAAC,MAAM;QAC3B,cAAc,EAAE,WAAW,CAAC,IAAI;KACjC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* trace_rpc_types — analyzes Hono RPC type exports for slow-pattern detection.
|
|
3
|
+
* Addresses Issue #3869: `export type X = typeof app` causes 8-min CI builds.
|
|
4
|
+
*
|
|
5
|
+
* Spec: docs/specs/2026-04-10-hono-framework-intelligence-spec.md (Task 20)
|
|
6
|
+
*/
|
|
7
|
+
export interface RpcTypesResult {
|
|
8
|
+
exports?: Array<{
|
|
9
|
+
name: string;
|
|
10
|
+
shape: "full_app" | "route_group";
|
|
11
|
+
is_slow: boolean;
|
|
12
|
+
source_var: string;
|
|
13
|
+
file: string;
|
|
14
|
+
line: number;
|
|
15
|
+
recommendation?: string;
|
|
16
|
+
}>;
|
|
17
|
+
has_slow_pattern?: boolean;
|
|
18
|
+
error?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function traceRpcTypes(repo: string): Promise<RpcTypesResult>;
|
|
21
|
+
//# sourceMappingURL=hono-rpc-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono-rpc-types.d.ts","sourceRoot":"","sources":["../../src/tools/hono-rpc-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,UAAU,GAAG,aAAa,CAAC;QAClC,OAAO,EAAE,OAAO,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC,CAAC;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAqCzE"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* trace_rpc_types — analyzes Hono RPC type exports for slow-pattern detection.
|
|
3
|
+
* Addresses Issue #3869: `export type X = typeof app` causes 8-min CI builds.
|
|
4
|
+
*
|
|
5
|
+
* Spec: docs/specs/2026-04-10-hono-framework-intelligence-spec.md (Task 20)
|
|
6
|
+
*/
|
|
7
|
+
import { getCodeIndex } from "./index-tools.js";
|
|
8
|
+
import { honoCache } from "../cache/hono-cache.js";
|
|
9
|
+
import { HonoExtractor } from "../parser/extractors/hono.js";
|
|
10
|
+
import { resolveHonoEntryFile } from "./hono-entry-resolver.js";
|
|
11
|
+
import { detectFrameworks } from "../utils/framework-detect.js";
|
|
12
|
+
export async function traceRpcTypes(repo) {
|
|
13
|
+
const index = await getCodeIndex(repo);
|
|
14
|
+
if (!index)
|
|
15
|
+
return { error: `Repository "${repo}" not found` };
|
|
16
|
+
const frameworks = detectFrameworks(index);
|
|
17
|
+
if (!frameworks.has("hono"))
|
|
18
|
+
return { error: "No Hono app detected" };
|
|
19
|
+
const entryFile = resolveHonoEntryFile(index);
|
|
20
|
+
if (!entryFile)
|
|
21
|
+
return { error: "No Hono entry file found" };
|
|
22
|
+
let model;
|
|
23
|
+
try {
|
|
24
|
+
model = await honoCache.get(repo, entryFile, new HonoExtractor());
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
28
|
+
return { error: `Failed to parse: ${msg}` };
|
|
29
|
+
}
|
|
30
|
+
const exports = model.rpc_exports.map((r) => {
|
|
31
|
+
const entry = {
|
|
32
|
+
name: r.export_name,
|
|
33
|
+
shape: r.shape,
|
|
34
|
+
is_slow: r.shape === "full_app",
|
|
35
|
+
source_var: r.source_var,
|
|
36
|
+
file: r.file,
|
|
37
|
+
line: r.line,
|
|
38
|
+
};
|
|
39
|
+
if (r.shape === "full_app") {
|
|
40
|
+
entry.recommendation = "Split into per-route-group type exports (Hono docs + Issue #3869) to reduce tsc compile time.";
|
|
41
|
+
}
|
|
42
|
+
return entry;
|
|
43
|
+
});
|
|
44
|
+
return {
|
|
45
|
+
exports,
|
|
46
|
+
has_slow_pattern: exports.some((e) => e.is_slow),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=hono-rpc-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono-rpc-types.js","sourceRoot":"","sources":["../../src/tools/hono-rpc-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAgBhE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY;IAC9C,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,eAAe,IAAI,aAAa,EAAE,CAAC;IAE/D,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;IAEtE,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC;IAE7D,IAAI,KAAK,CAAC;IACV,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,aAAa,EAAE,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,EAAE,KAAK,EAAE,oBAAoB,GAAG,EAAE,EAAE,CAAC;IAC9C,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC1C,MAAM,KAAK,GAAmD;YAC5D,IAAI,EAAE,CAAC,CAAC,WAAW;YACnB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,OAAO,EAAE,CAAC,CAAC,KAAK,KAAK,UAAU;YAC/B,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;SACb,CAAC;QACF,IAAI,CAAC,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YAC3B,KAAK,CAAC,cAAc,GAAG,+FAA+F,CAAC;QACzH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,OAAO;QACP,gBAAgB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;KACjD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* audit_hono_security — security + type-safety audit of Hono application.
|
|
3
|
+
*
|
|
4
|
+
* Checks:
|
|
5
|
+
* - missing-secure-headers (global)
|
|
6
|
+
* - missing-rate-limit (mutation routes, conditional-aware)
|
|
7
|
+
* - missing-auth (mutation routes, conditional-aware)
|
|
8
|
+
* - auth-ordering (auth after non-auth in a chain)
|
|
9
|
+
* - env-regression (plain createMiddleware in 3+ chains, Issue #3587)
|
|
10
|
+
* — absorbed from the former detect_middleware_env_regression tool.
|
|
11
|
+
* It is a type-safety check that still walks middleware chains,
|
|
12
|
+
* so it fits the audit surface.
|
|
13
|
+
*
|
|
14
|
+
* Spec: docs/specs/2026-04-10-hono-framework-intelligence-spec.md (Task 21) +
|
|
15
|
+
* docs/specs/2026-04-11-hono-phase-2-plan.md (T10 consolidation)
|
|
16
|
+
*/
|
|
17
|
+
export interface SecurityFinding {
|
|
18
|
+
severity: "CRITICAL" | "HIGH" | "MEDIUM" | "LOW";
|
|
19
|
+
rule: string;
|
|
20
|
+
message: string;
|
|
21
|
+
file?: string;
|
|
22
|
+
line?: number;
|
|
23
|
+
}
|
|
24
|
+
export interface SecurityAuditResult {
|
|
25
|
+
findings?: SecurityFinding[];
|
|
26
|
+
/** Heuristic disclaimers for rules that rely on regex/lookups rather than a real type checker. */
|
|
27
|
+
notes?: Record<string, string>;
|
|
28
|
+
error?: string;
|
|
29
|
+
}
|
|
30
|
+
export declare function auditHonoSecurity(repo: string): Promise<SecurityAuditResult>;
|
|
31
|
+
//# sourceMappingURL=hono-security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono-security.d.ts","sourceRoot":"","sources":["../../src/tools/hono-security.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAYH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B,kGAAkG;IAClG,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAoDD,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,mBAAmB,CAAC,CA6J9B"}
|