codesift-mcp 0.9.5 → 0.10.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 +62 -23
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +92 -2
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/help.d.ts +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +18 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/hooks/input.d.ts +11 -0
- package/dist/cli/hooks/input.d.ts.map +1 -0
- package/dist/cli/hooks/input.js +111 -0
- package/dist/cli/hooks/input.js.map +1 -0
- package/dist/cli/hooks/post-tool-use.d.ts +2 -0
- package/dist/cli/hooks/post-tool-use.d.ts.map +1 -0
- package/dist/cli/hooks/post-tool-use.js +339 -0
- package/dist/cli/hooks/post-tool-use.js.map +1 -0
- package/dist/cli/hooks/pre-compact.d.ts +2 -0
- package/dist/cli/hooks/pre-compact.d.ts.map +1 -0
- package/dist/cli/hooks/pre-compact.js +41 -0
- package/dist/cli/hooks/pre-compact.js.map +1 -0
- package/dist/cli/hooks/pre-tool-use.d.ts +5 -0
- package/dist/cli/hooks/pre-tool-use.d.ts.map +1 -0
- package/dist/cli/hooks/pre-tool-use.js +215 -0
- package/dist/cli/hooks/pre-tool-use.js.map +1 -0
- package/dist/cli/hooks/session.d.ts +5 -0
- package/dist/cli/hooks/session.d.ts.map +1 -0
- package/dist/cli/hooks/session.js +188 -0
- package/dist/cli/hooks/session.js.map +1 -0
- package/dist/cli/hooks/shared.d.ts +6 -0
- package/dist/cli/hooks/shared.d.ts.map +1 -0
- package/dist/cli/hooks/shared.js +70 -0
- package/dist/cli/hooks/shared.js.map +1 -0
- package/dist/cli/hooks/wiki.d.ts +10 -0
- package/dist/cli/hooks/wiki.d.ts.map +1 -0
- package/dist/cli/hooks/wiki.js +202 -0
- package/dist/cli/hooks/wiki.js.map +1 -0
- package/dist/cli/hooks.d.ts +5 -16
- package/dist/cli/hooks.d.ts.map +1 -1
- package/dist/cli/hooks.js +5 -1132
- package/dist/cli/hooks.js.map +1 -1
- package/dist/cli/setup/claude.d.ts +4 -0
- package/dist/cli/setup/claude.d.ts.map +1 -0
- package/dist/cli/setup/claude.js +123 -0
- package/dist/cli/setup/claude.js.map +1 -0
- package/dist/cli/setup/codex.d.ts +12 -0
- package/dist/cli/setup/codex.d.ts.map +1 -0
- package/dist/cli/setup/codex.js +182 -0
- package/dist/cli/setup/codex.js.map +1 -0
- package/dist/cli/setup/cursor.d.ts +3 -0
- package/dist/cli/setup/cursor.d.ts.map +1 -0
- package/dist/cli/setup/cursor.js +6 -0
- package/dist/cli/setup/cursor.js.map +1 -0
- package/dist/cli/setup/fs.d.ts +6 -0
- package/dist/cli/setup/fs.d.ts.map +1 -0
- package/dist/cli/setup/fs.js +44 -0
- package/dist/cli/setup/fs.js.map +1 -0
- package/dist/cli/setup/gemini.d.ts +5 -0
- package/dist/cli/setup/gemini.d.ts.map +1 -0
- package/dist/cli/setup/gemini.js +46 -0
- package/dist/cli/setup/gemini.js.map +1 -0
- package/dist/cli/setup/hooks.d.ts +12 -0
- package/dist/cli/setup/hooks.d.ts.map +1 -0
- package/dist/cli/setup/hooks.js +29 -0
- package/dist/cli/setup/hooks.js.map +1 -0
- package/dist/cli/setup/mcp.d.ts +13 -0
- package/dist/cli/setup/mcp.d.ts.map +1 -0
- package/dist/cli/setup/mcp.js +104 -0
- package/dist/cli/setup/mcp.js.map +1 -0
- package/dist/cli/setup/rules.d.ts +4 -0
- package/dist/cli/setup/rules.d.ts.map +1 -0
- package/dist/cli/setup/rules.js +157 -0
- package/dist/cli/setup/rules.js.map +1 -0
- package/dist/cli/setup/types.d.ts +24 -0
- package/dist/cli/setup/types.d.ts.map +1 -0
- package/dist/cli/setup/types.js +2 -0
- package/dist/cli/setup/types.js.map +1 -0
- package/dist/cli/setup.d.ts +8 -48
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +49 -705
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/telemetry-commands.d.ts +2 -0
- package/dist/cli/telemetry-commands.d.ts.map +1 -0
- package/dist/cli/telemetry-commands.js +50 -0
- package/dist/cli/telemetry-commands.js.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +56 -2
- package/dist/config.js.map +1 -1
- package/dist/formatter-dispatch.d.ts +53 -0
- package/dist/formatter-dispatch.d.ts.map +1 -0
- package/dist/formatter-dispatch.js +54 -0
- package/dist/formatter-dispatch.js.map +1 -0
- package/dist/formatters-analysis.d.ts +9 -0
- package/dist/formatters-analysis.d.ts.map +1 -0
- package/dist/formatters-analysis.js +166 -0
- package/dist/formatters-analysis.js.map +1 -0
- package/dist/formatters-core.d.ts +200 -0
- package/dist/formatters-core.d.ts.map +1 -0
- package/dist/formatters-core.js +206 -0
- package/dist/formatters-core.js.map +1 -0
- package/dist/formatters-graph.d.ts +124 -0
- package/dist/formatters-graph.d.ts.map +1 -0
- package/dist/formatters-graph.js +175 -0
- package/dist/formatters-graph.js.map +1 -0
- package/dist/formatters-nextjs.d.ts +22 -0
- package/dist/formatters-nextjs.d.ts.map +1 -0
- package/dist/formatters-nextjs.js +394 -0
- package/dist/formatters-nextjs.js.map +1 -0
- package/dist/formatters.d.ts +8 -349
- package/dist/formatters.d.ts.map +1 -1
- package/dist/formatters.js +10 -929
- package/dist/formatters.js.map +1 -1
- package/dist/parser/astro-template/preprocess.d.ts +12 -0
- package/dist/parser/astro-template/preprocess.d.ts.map +1 -0
- package/dist/parser/astro-template/preprocess.js +34 -0
- package/dist/parser/astro-template/preprocess.js.map +1 -0
- package/dist/parser/astro-template/resolution.d.ts +16 -0
- package/dist/parser/astro-template/resolution.d.ts.map +1 -0
- package/dist/parser/astro-template/resolution.js +58 -0
- package/dist/parser/astro-template/resolution.js.map +1 -0
- package/dist/parser/astro-template/scanner.d.ts +4 -0
- package/dist/parser/astro-template/scanner.d.ts.map +1 -0
- package/dist/parser/astro-template/scanner.js +71 -0
- package/dist/parser/astro-template/scanner.js.map +1 -0
- package/dist/parser/astro-template/state.d.ts +22 -0
- package/dist/parser/astro-template/state.d.ts.map +1 -0
- package/dist/parser/astro-template/state.js +48 -0
- package/dist/parser/astro-template/state.js.map +1 -0
- package/dist/parser/astro-template/tag-processor.d.ts +3 -0
- package/dist/parser/astro-template/tag-processor.d.ts.map +1 -0
- package/dist/parser/astro-template/tag-processor.js +63 -0
- package/dist/parser/astro-template/tag-processor.js.map +1 -0
- package/dist/parser/astro-template/types.d.ts +42 -0
- package/dist/parser/astro-template/types.d.ts.map +1 -0
- package/dist/parser/astro-template/types.js +2 -0
- package/dist/parser/astro-template/types.js.map +1 -0
- package/dist/parser/astro-template.d.ts +2 -45
- package/dist/parser/astro-template.d.ts.map +1 -1
- package/dist/parser/astro-template.js +7 -168
- package/dist/parser/astro-template.js.map +1 -1
- package/dist/parser/extractors/_shared.js +1 -1
- package/dist/parser/extractors/_shared.js.map +1 -1
- package/dist/parser/extractors/astro.js +1 -1
- package/dist/parser/extractors/astro.js.map +1 -1
- package/dist/parser/extractors/conversation.js +1 -1
- package/dist/parser/extractors/conversation.js.map +1 -1
- package/dist/parser/extractors/hono-app-discovery.d.ts +4 -0
- package/dist/parser/extractors/hono-app-discovery.d.ts.map +1 -0
- package/dist/parser/extractors/hono-app-discovery.js +169 -0
- package/dist/parser/extractors/hono-app-discovery.js.map +1 -0
- package/dist/parser/extractors/hono-ast-utils.d.ts +6 -0
- package/dist/parser/extractors/hono-ast-utils.d.ts.map +1 -0
- package/dist/parser/extractors/hono-ast-utils.js +77 -0
- package/dist/parser/extractors/hono-ast-utils.js.map +1 -0
- package/dist/parser/extractors/hono-context-extractor.d.ts +15 -0
- package/dist/parser/extractors/hono-context-extractor.d.ts.map +1 -0
- package/dist/parser/extractors/hono-context-extractor.js +191 -0
- package/dist/parser/extractors/hono-context-extractor.js.map +1 -0
- package/dist/parser/extractors/hono-middleware-extractor.d.ts +38 -0
- package/dist/parser/extractors/hono-middleware-extractor.d.ts.map +1 -0
- package/dist/parser/extractors/hono-middleware-extractor.js +480 -0
- package/dist/parser/extractors/hono-middleware-extractor.js.map +1 -0
- package/dist/parser/extractors/hono-openapi-extractor.d.ts +11 -0
- package/dist/parser/extractors/hono-openapi-extractor.d.ts.map +1 -0
- package/dist/parser/extractors/hono-openapi-extractor.js +119 -0
- package/dist/parser/extractors/hono-openapi-extractor.js.map +1 -0
- package/dist/parser/extractors/hono-route-extractor.d.ts +11 -0
- package/dist/parser/extractors/hono-route-extractor.d.ts.map +1 -0
- package/dist/parser/extractors/hono-route-extractor.js +128 -0
- package/dist/parser/extractors/hono-route-extractor.js.map +1 -0
- package/dist/parser/extractors/hono-route-utils.d.ts +11 -0
- package/dist/parser/extractors/hono-route-utils.d.ts.map +1 -0
- package/dist/parser/extractors/hono-route-utils.js +40 -0
- package/dist/parser/extractors/hono-route-utils.js.map +1 -0
- package/dist/parser/extractors/hono-runtime-extractor.d.ts +17 -0
- package/dist/parser/extractors/hono-runtime-extractor.d.ts.map +1 -0
- package/dist/parser/extractors/hono-runtime-extractor.js +141 -0
- package/dist/parser/extractors/hono-runtime-extractor.js.map +1 -0
- package/dist/parser/extractors/hono.d.ts +5 -79
- package/dist/parser/extractors/hono.d.ts.map +1 -1
- package/dist/parser/extractors/hono.js +32 -1159
- package/dist/parser/extractors/hono.js.map +1 -1
- package/dist/parser/extractors/kotlin-ast-helpers.d.ts +43 -0
- package/dist/parser/extractors/kotlin-ast-helpers.d.ts.map +1 -0
- package/dist/parser/extractors/kotlin-ast-helpers.js +187 -0
- package/dist/parser/extractors/kotlin-ast-helpers.js.map +1 -0
- package/dist/parser/extractors/kotlin-test-symbols.d.ts +21 -0
- package/dist/parser/extractors/kotlin-test-symbols.d.ts.map +1 -0
- package/dist/parser/extractors/kotlin-test-symbols.js +162 -0
- package/dist/parser/extractors/kotlin-test-symbols.js.map +1 -0
- package/dist/parser/extractors/kotlin.d.ts.map +1 -1
- package/dist/parser/extractors/kotlin.js +3 -334
- package/dist/parser/extractors/kotlin.js.map +1 -1
- package/dist/parser/extractors/markdown.js +1 -1
- package/dist/parser/extractors/markdown.js.map +1 -1
- package/dist/parser/extractors/prisma.js +1 -1
- package/dist/parser/extractors/prisma.js.map +1 -1
- package/dist/parser/extractors/sql-boundaries.d.ts +3 -0
- package/dist/parser/extractors/sql-boundaries.d.ts.map +1 -0
- package/dist/parser/extractors/sql-boundaries.js +19 -0
- package/dist/parser/extractors/sql-boundaries.js.map +1 -0
- package/dist/parser/extractors/sql-columns.d.ts +14 -0
- package/dist/parser/extractors/sql-columns.d.ts.map +1 -0
- package/dist/parser/extractors/sql-columns.js +59 -0
- package/dist/parser/extractors/sql-columns.js.map +1 -0
- package/dist/parser/extractors/sql-docstrings.d.ts +2 -0
- package/dist/parser/extractors/sql-docstrings.d.ts.map +1 -0
- package/dist/parser/extractors/sql-docstrings.js +45 -0
- package/dist/parser/extractors/sql-docstrings.js.map +1 -0
- package/dist/parser/extractors/sql-end-scanner.d.ts +5 -0
- package/dist/parser/extractors/sql-end-scanner.d.ts.map +1 -0
- package/dist/parser/extractors/sql-end-scanner.js +84 -0
- package/dist/parser/extractors/sql-end-scanner.js.map +1 -0
- package/dist/parser/extractors/sql-jinja.d.ts +2 -0
- package/dist/parser/extractors/sql-jinja.d.ts.map +1 -0
- package/dist/parser/extractors/sql-jinja.js +8 -0
- package/dist/parser/extractors/sql-jinja.js.map +1 -0
- package/dist/parser/extractors/sql-matcher-catalog.d.ts +9 -0
- package/dist/parser/extractors/sql-matcher-catalog.d.ts.map +1 -0
- package/dist/parser/extractors/sql-matcher-catalog.js +15 -0
- package/dist/parser/extractors/sql-matcher-catalog.js.map +1 -0
- package/dist/parser/extractors/sql-matchers.d.ts +9 -0
- package/dist/parser/extractors/sql-matchers.d.ts.map +1 -0
- package/dist/parser/extractors/sql-matchers.js +20 -0
- package/dist/parser/extractors/sql-matchers.js.map +1 -0
- package/dist/parser/extractors/sql-offsets.d.ts +2 -0
- package/dist/parser/extractors/sql-offsets.d.ts.map +1 -0
- package/dist/parser/extractors/sql-offsets.js +25 -0
- package/dist/parser/extractors/sql-offsets.js.map +1 -0
- package/dist/parser/extractors/sql-parens.d.ts +4 -0
- package/dist/parser/extractors/sql-parens.d.ts.map +1 -0
- package/dist/parser/extractors/sql-parens.js +70 -0
- package/dist/parser/extractors/sql-parens.js.map +1 -0
- package/dist/parser/extractors/sql-symbols.d.ts +11 -0
- package/dist/parser/extractors/sql-symbols.d.ts.map +1 -0
- package/dist/parser/extractors/sql-symbols.js +23 -0
- package/dist/parser/extractors/sql-symbols.js.map +1 -0
- package/dist/parser/extractors/sql.d.ts +2 -30
- package/dist/parser/extractors/sql.d.ts.map +1 -1
- package/dist/parser/extractors/sql.js +23 -496
- package/dist/parser/extractors/sql.js.map +1 -1
- package/dist/parser/extractors/typescript-cjs-nodes.d.ts +5 -0
- package/dist/parser/extractors/typescript-cjs-nodes.d.ts.map +1 -0
- package/dist/parser/extractors/typescript-cjs-nodes.js +148 -0
- package/dist/parser/extractors/typescript-cjs-nodes.js.map +1 -0
- package/dist/parser/extractors/typescript-class-nodes.d.ts +8 -0
- package/dist/parser/extractors/typescript-class-nodes.d.ts.map +1 -0
- package/dist/parser/extractors/typescript-class-nodes.js +183 -0
- package/dist/parser/extractors/typescript-class-nodes.js.map +1 -0
- package/dist/parser/extractors/typescript-declaration-nodes.d.ts +5 -0
- package/dist/parser/extractors/typescript-declaration-nodes.d.ts.map +1 -0
- package/dist/parser/extractors/typescript-declaration-nodes.js +105 -0
- package/dist/parser/extractors/typescript-declaration-nodes.js.map +1 -0
- package/dist/parser/extractors/typescript-module-nodes.d.ts +6 -0
- package/dist/parser/extractors/typescript-module-nodes.d.ts.map +1 -0
- package/dist/parser/extractors/typescript-module-nodes.js +151 -0
- package/dist/parser/extractors/typescript-module-nodes.js.map +1 -0
- package/dist/parser/extractors/typescript-react.d.ts +11 -0
- package/dist/parser/extractors/typescript-react.d.ts.map +1 -0
- package/dist/parser/extractors/typescript-react.js +101 -0
- package/dist/parser/extractors/typescript-react.js.map +1 -0
- package/dist/parser/extractors/typescript-shared.d.ts +26 -0
- package/dist/parser/extractors/typescript-shared.d.ts.map +1 -0
- package/dist/parser/extractors/typescript-shared.js +101 -0
- package/dist/parser/extractors/typescript-shared.js.map +1 -0
- package/dist/parser/extractors/typescript-test-nodes.d.ts +4 -0
- package/dist/parser/extractors/typescript-test-nodes.d.ts.map +1 -0
- package/dist/parser/extractors/typescript-test-nodes.js +112 -0
- package/dist/parser/extractors/typescript-test-nodes.js.map +1 -0
- package/dist/parser/extractors/typescript-type-nodes.d.ts +6 -0
- package/dist/parser/extractors/typescript-type-nodes.d.ts.map +1 -0
- package/dist/parser/extractors/typescript-type-nodes.js +48 -0
- package/dist/parser/extractors/typescript-type-nodes.js.map +1 -0
- package/dist/parser/extractors/typescript.d.ts.map +1 -1
- package/dist/parser/extractors/typescript.js +68 -1127
- package/dist/parser/extractors/typescript.js.map +1 -1
- package/dist/parser/parser-manager.d.ts.map +1 -1
- package/dist/parser/parser-manager.js +5 -0
- package/dist/parser/parser-manager.js.map +1 -1
- package/dist/parser/symbol-extractor.d.ts +1 -12
- package/dist/parser/symbol-extractor.d.ts.map +1 -1
- package/dist/parser/symbol-extractor.js +2 -24
- package/dist/parser/symbol-extractor.js.map +1 -1
- package/dist/parser/symbol-utils.d.ts +4 -0
- package/dist/parser/symbol-utils.d.ts.map +1 -0
- package/dist/parser/symbol-utils.js +20 -0
- package/dist/parser/symbol-utils.js.map +1 -0
- package/dist/register-tool-groups/analysis/cross-repo.d.ts +4 -0
- package/dist/register-tool-groups/analysis/cross-repo.d.ts.map +1 -0
- package/dist/register-tool-groups/analysis/cross-repo.js +108 -0
- package/dist/register-tool-groups/analysis/cross-repo.js.map +1 -0
- package/dist/register-tool-groups/analysis/review.d.ts +3 -0
- package/dist/register-tool-groups/analysis/review.d.ts.map +1 -0
- package/dist/register-tool-groups/analysis/review.js +96 -0
- package/dist/register-tool-groups/analysis/review.js.map +1 -0
- package/dist/register-tool-groups/analysis/workspace.d.ts +3 -0
- package/dist/register-tool-groups/analysis/workspace.d.ts.map +1 -0
- package/dist/register-tool-groups/analysis/workspace.js +82 -0
- package/dist/register-tool-groups/analysis/workspace.js.map +1 -0
- package/dist/register-tool-groups/analysis.d.ts +3 -0
- package/dist/register-tool-groups/analysis.d.ts.map +1 -0
- package/dist/register-tool-groups/analysis.js +541 -0
- package/dist/register-tool-groups/analysis.js.map +1 -0
- package/dist/register-tool-groups/astro.d.ts +3 -0
- package/dist/register-tool-groups/astro.d.ts.map +1 -0
- package/dist/register-tool-groups/astro.js +302 -0
- package/dist/register-tool-groups/astro.js.map +1 -0
- package/dist/register-tool-groups/core/index.d.ts +3 -0
- package/dist/register-tool-groups/core/index.d.ts.map +1 -0
- package/dist/register-tool-groups/core/index.js +96 -0
- package/dist/register-tool-groups/core/index.js.map +1 -0
- package/dist/register-tool-groups/core/meta.d.ts +3 -0
- package/dist/register-tool-groups/core/meta.d.ts.map +1 -0
- package/dist/register-tool-groups/core/meta.js +180 -0
- package/dist/register-tool-groups/core/meta.js.map +1 -0
- package/dist/register-tool-groups/core/schema.d.ts +3 -0
- package/dist/register-tool-groups/core/schema.d.ts.map +1 -0
- package/dist/register-tool-groups/core/schema.js +16 -0
- package/dist/register-tool-groups/core/schema.js.map +1 -0
- package/dist/register-tool-groups/core/search.d.ts +4 -0
- package/dist/register-tool-groups/core/search.d.ts.map +1 -0
- package/dist/register-tool-groups/core/search.js +262 -0
- package/dist/register-tool-groups/core/search.js.map +1 -0
- package/dist/register-tool-groups/core/symbols.d.ts +3 -0
- package/dist/register-tool-groups/core/symbols.d.ts.map +1 -0
- package/dist/register-tool-groups/core/symbols.js +338 -0
- package/dist/register-tool-groups/core/symbols.js.map +1 -0
- package/dist/register-tool-groups/core.d.ts +3 -0
- package/dist/register-tool-groups/core.d.ts.map +1 -0
- package/dist/register-tool-groups/core.js +12 -0
- package/dist/register-tool-groups/core.js.map +1 -0
- package/dist/register-tool-groups/deps.d.ts +10 -0
- package/dist/register-tool-groups/deps.d.ts.map +1 -0
- package/dist/register-tool-groups/deps.js +6 -0
- package/dist/register-tool-groups/deps.js.map +1 -0
- package/dist/register-tool-groups/handler-wrappers.d.ts +63 -0
- package/dist/register-tool-groups/handler-wrappers.d.ts.map +1 -0
- package/dist/register-tool-groups/handler-wrappers.js +106 -0
- package/dist/register-tool-groups/handler-wrappers.js.map +1 -0
- package/dist/register-tool-groups/hono.d.ts +3 -0
- package/dist/register-tool-groups/hono.d.ts.map +1 -0
- package/dist/register-tool-groups/hono.js +179 -0
- package/dist/register-tool-groups/hono.js.map +1 -0
- package/dist/register-tool-groups/index.d.ts +3 -0
- package/dist/register-tool-groups/index.d.ts.map +1 -0
- package/dist/register-tool-groups/index.js +28 -0
- package/dist/register-tool-groups/index.js.map +1 -0
- package/dist/register-tool-groups/kotlin.d.ts +3 -0
- package/dist/register-tool-groups/kotlin.d.ts.map +1 -0
- package/dist/register-tool-groups/kotlin.js +162 -0
- package/dist/register-tool-groups/kotlin.js.map +1 -0
- package/dist/register-tool-groups/meta.d.ts +3 -0
- package/dist/register-tool-groups/meta.d.ts.map +1 -0
- package/dist/register-tool-groups/meta.js +563 -0
- package/dist/register-tool-groups/meta.js.map +1 -0
- package/dist/register-tool-groups/nextjs.d.ts +3 -0
- package/dist/register-tool-groups/nextjs.d.ts.map +1 -0
- package/dist/register-tool-groups/nextjs.js +78 -0
- package/dist/register-tool-groups/nextjs.js.map +1 -0
- package/dist/register-tool-groups/php.d.ts +3 -0
- package/dist/register-tool-groups/php.d.ts.map +1 -0
- package/dist/register-tool-groups/php.js +312 -0
- package/dist/register-tool-groups/php.js.map +1 -0
- package/dist/register-tool-groups/python.d.ts +3 -0
- package/dist/register-tool-groups/python.d.ts.map +1 -0
- package/dist/register-tool-groups/python.js +366 -0
- package/dist/register-tool-groups/python.js.map +1 -0
- package/dist/register-tool-groups/react.d.ts +3 -0
- package/dist/register-tool-groups/react.d.ts.map +1 -0
- package/dist/register-tool-groups/react.js +119 -0
- package/dist/register-tool-groups/react.js.map +1 -0
- package/dist/register-tool-groups/shared.d.ts +156 -0
- package/dist/register-tool-groups/shared.d.ts.map +1 -0
- package/dist/register-tool-groups/shared.js +182 -0
- package/dist/register-tool-groups/shared.js.map +1 -0
- package/dist/register-tool-groups/sql.d.ts +3 -0
- package/dist/register-tool-groups/sql.d.ts.map +1 -0
- package/dist/register-tool-groups/sql.js +260 -0
- package/dist/register-tool-groups/sql.js.map +1 -0
- package/dist/register-tool-loaders.d.ts +22 -22
- package/dist/register-tool-loaders.d.ts.map +1 -1
- package/dist/register-tools/autoload.d.ts +8 -0
- package/dist/register-tools/autoload.d.ts.map +1 -0
- package/dist/register-tools/autoload.js +517 -0
- package/dist/register-tools/autoload.js.map +1 -0
- package/dist/register-tools/discovery.d.ts +55 -0
- package/dist/register-tools/discovery.d.ts.map +1 -0
- package/dist/register-tools/discovery.js +206 -0
- package/dist/register-tools/discovery.js.map +1 -0
- package/dist/register-tools/runtime.d.ts +89 -0
- package/dist/register-tools/runtime.d.ts.map +1 -0
- package/dist/register-tools/runtime.js +491 -0
- package/dist/register-tools/runtime.js.map +1 -0
- package/dist/register-tools.d.ts +5 -172
- package/dist/register-tools.d.ts.map +1 -1
- package/dist/register-tools.js +27 -4878
- package/dist/register-tools.js.map +1 -1
- package/dist/search/bm25.js +1 -1
- package/dist/search/bm25.js.map +1 -1
- package/dist/search/tool-embedding-cache.d.ts +4 -0
- package/dist/search/tool-embedding-cache.d.ts.map +1 -0
- package/dist/search/tool-embedding-cache.js +44 -0
- package/dist/search/tool-embedding-cache.js.map +1 -0
- package/dist/search/tool-embedding-storage.d.ts +8 -0
- package/dist/search/tool-embedding-storage.d.ts.map +1 -0
- package/dist/search/tool-embedding-storage.js +56 -0
- package/dist/search/tool-embedding-storage.js.map +1 -0
- package/dist/search/tool-ranker-bm25.d.ts +6 -0
- package/dist/search/tool-ranker-bm25.d.ts.map +1 -0
- package/dist/search/tool-ranker-bm25.js +40 -0
- package/dist/search/tool-ranker-bm25.js.map +1 -0
- package/dist/search/tool-ranker-orchestrator.d.ts +3 -0
- package/dist/search/tool-ranker-orchestrator.d.ts.map +1 -0
- package/dist/search/tool-ranker-orchestrator.js +49 -0
- package/dist/search/tool-ranker-orchestrator.js.map +1 -0
- package/dist/search/tool-ranker-reasoning.d.ts +4 -0
- package/dist/search/tool-ranker-reasoning.d.ts.map +1 -0
- package/dist/search/tool-ranker-reasoning.js +35 -0
- package/dist/search/tool-ranker-reasoning.js.map +1 -0
- package/dist/search/tool-ranker-signal-math.d.ts +6 -0
- package/dist/search/tool-ranker-signal-math.d.ts.map +1 -0
- package/dist/search/tool-ranker-signal-math.js +51 -0
- package/dist/search/tool-ranker-signal-math.js.map +1 -0
- package/dist/search/tool-ranker-signals.d.ts +20 -0
- package/dist/search/tool-ranker-signals.d.ts.map +1 -0
- package/dist/search/tool-ranker-signals.js +50 -0
- package/dist/search/tool-ranker-signals.js.map +1 -0
- package/dist/search/tool-ranker-types.d.ts +26 -0
- package/dist/search/tool-ranker-types.d.ts.map +1 -0
- package/dist/search/tool-ranker-types.js +2 -0
- package/dist/search/tool-ranker-types.js.map +1 -0
- package/dist/search/tool-ranker.d.ts +6 -89
- package/dist/search/tool-ranker.d.ts.map +1 -1
- package/dist/search/tool-ranker.js +5 -419
- package/dist/search/tool-ranker.js.map +1 -1
- package/dist/server-helpers/repo-resolution.d.ts +45 -0
- package/dist/server-helpers/repo-resolution.d.ts.map +1 -0
- package/dist/server-helpers/repo-resolution.js +113 -0
- package/dist/server-helpers/repo-resolution.js.map +1 -0
- package/dist/server-helpers/response-hints.d.ts +9 -0
- package/dist/server-helpers/response-hints.d.ts.map +1 -0
- package/dist/server-helpers/response-hints.js +225 -0
- package/dist/server-helpers/response-hints.js.map +1 -0
- package/dist/server-helpers.d.ts +14 -35
- package/dist/server-helpers.d.ts.map +1 -1
- package/dist/server-helpers.js +62 -322
- package/dist/server-helpers.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +45 -0
- package/dist/server.js.map +1 -1
- package/dist/storage/_shared.d.ts +9 -0
- package/dist/storage/_shared.d.ts.map +1 -1
- package/dist/storage/_shared.js +24 -0
- package/dist/storage/_shared.js.map +1 -1
- package/dist/storage/telemetry/aggregator.d.ts +52 -0
- package/dist/storage/telemetry/aggregator.d.ts.map +1 -0
- package/dist/storage/telemetry/aggregator.js +188 -0
- package/dist/storage/telemetry/aggregator.js.map +1 -0
- package/dist/storage/telemetry/anon-id.d.ts +11 -0
- package/dist/storage/telemetry/anon-id.d.ts.map +1 -0
- package/dist/storage/telemetry/anon-id.js +62 -0
- package/dist/storage/telemetry/anon-id.js.map +1 -0
- package/dist/storage/telemetry/config.d.ts +37 -0
- package/dist/storage/telemetry/config.d.ts.map +1 -0
- package/dist/storage/telemetry/config.js +130 -0
- package/dist/storage/telemetry/config.js.map +1 -0
- package/dist/storage/telemetry/env-profile.d.ts +19 -0
- package/dist/storage/telemetry/env-profile.d.ts.map +1 -0
- package/dist/storage/telemetry/env-profile.js +67 -0
- package/dist/storage/telemetry/env-profile.js.map +1 -0
- package/dist/storage/telemetry/payload.d.ts +8 -0
- package/dist/storage/telemetry/payload.d.ts.map +1 -0
- package/dist/storage/telemetry/payload.js +22 -0
- package/dist/storage/telemetry/payload.js.map +1 -0
- package/dist/storage/telemetry/sanitizer.d.ts +48 -0
- package/dist/storage/telemetry/sanitizer.d.ts.map +1 -0
- package/dist/storage/telemetry/sanitizer.js +82 -0
- package/dist/storage/telemetry/sanitizer.js.map +1 -0
- package/dist/storage/telemetry/uploader.d.ts +11 -0
- package/dist/storage/telemetry/uploader.d.ts.map +1 -0
- package/dist/storage/telemetry/uploader.js +140 -0
- package/dist/storage/telemetry/uploader.js.map +1 -0
- package/dist/storage/usage-tracker.d.ts +13 -0
- package/dist/storage/usage-tracker.d.ts.map +1 -1
- package/dist/storage/usage-tracker.js +33 -0
- package/dist/storage/usage-tracker.js.map +1 -1
- package/dist/tools/astro-actions/ast.d.ts +14 -0
- package/dist/tools/astro-actions/ast.d.ts.map +1 -0
- package/dist/tools/astro-actions/ast.js +75 -0
- package/dist/tools/astro-actions/ast.js.map +1 -0
- package/dist/tools/astro-actions/audit.d.ts +5 -0
- package/dist/tools/astro-actions/audit.d.ts.map +1 -0
- package/dist/tools/astro-actions/audit.js +102 -0
- package/dist/tools/astro-actions/audit.js.map +1 -0
- package/dist/tools/astro-actions/callers.d.ts +9 -0
- package/dist/tools/astro-actions/callers.d.ts.map +1 -0
- package/dist/tools/astro-actions/callers.js +84 -0
- package/dist/tools/astro-actions/callers.js.map +1 -0
- package/dist/tools/astro-actions/parser.d.ts +3 -0
- package/dist/tools/astro-actions/parser.d.ts.map +1 -0
- package/dist/tools/astro-actions/parser.js +156 -0
- package/dist/tools/astro-actions/parser.js.map +1 -0
- package/dist/tools/astro-actions/types.d.ts +58 -0
- package/dist/tools/astro-actions/types.d.ts.map +1 -0
- package/dist/tools/astro-actions/types.js +2 -0
- package/dist/tools/astro-actions/types.js.map +1 -0
- package/dist/tools/astro-actions/zod-ast.d.ts +7 -0
- package/dist/tools/astro-actions/zod-ast.d.ts.map +1 -0
- package/dist/tools/astro-actions/zod-ast.js +51 -0
- package/dist/tools/astro-actions/zod-ast.js.map +1 -0
- package/dist/tools/astro-actions.d.ts +6 -46
- package/dist/tools/astro-actions.d.ts.map +1 -1
- package/dist/tools/astro-actions.js +6 -545
- package/dist/tools/astro-actions.js.map +1 -1
- package/dist/tools/astro-content-collections/diagnostics.d.ts +3 -0
- package/dist/tools/astro-content-collections/diagnostics.d.ts.map +1 -0
- package/dist/tools/astro-content-collections/diagnostics.js +277 -0
- package/dist/tools/astro-content-collections/diagnostics.js.map +1 -0
- package/dist/tools/astro-content-collections/discovery.d.ts +6 -0
- package/dist/tools/astro-content-collections/discovery.d.ts.map +1 -0
- package/dist/tools/astro-content-collections/discovery.js +152 -0
- package/dist/tools/astro-content-collections/discovery.js.map +1 -0
- package/dist/tools/astro-content-collections/schema.d.ts +15 -0
- package/dist/tools/astro-content-collections/schema.d.ts.map +1 -0
- package/dist/tools/astro-content-collections/schema.js +119 -0
- package/dist/tools/astro-content-collections/schema.js.map +1 -0
- package/dist/tools/astro-content-collections/types.d.ts +61 -0
- package/dist/tools/astro-content-collections/types.d.ts.map +1 -0
- package/dist/tools/astro-content-collections/types.js +2 -0
- package/dist/tools/astro-content-collections/types.js.map +1 -0
- package/dist/tools/astro-content-collections.d.ts +5 -40
- package/dist/tools/astro-content-collections.d.ts.map +1 -1
- package/dist/tools/astro-content-collections.js +42 -449
- package/dist/tools/astro-content-collections.js.map +1 -1
- package/dist/tools/astro-routes.js +1 -1
- package/dist/tools/astro-routes.js.map +1 -1
- package/dist/tools/complexity-tools.d.ts +6 -0
- package/dist/tools/complexity-tools.d.ts.map +1 -1
- package/dist/tools/complexity-tools.js +26 -0
- package/dist/tools/complexity-tools.js.map +1 -1
- package/dist/tools/context-levels/l0.d.ts +4 -0
- package/dist/tools/context-levels/l0.d.ts.map +1 -0
- package/dist/tools/context-levels/l0.js +17 -0
- package/dist/tools/context-levels/l0.js.map +1 -0
- package/dist/tools/context-levels/l1.d.ts +4 -0
- package/dist/tools/context-levels/l1.d.ts.map +1 -0
- package/dist/tools/context-levels/l1.js +26 -0
- package/dist/tools/context-levels/l1.js.map +1 -0
- package/dist/tools/context-levels/l2.d.ts +4 -0
- package/dist/tools/context-levels/l2.d.ts.map +1 -0
- package/dist/tools/context-levels/l2.js +36 -0
- package/dist/tools/context-levels/l2.js.map +1 -0
- package/dist/tools/context-levels/l3.d.ts +4 -0
- package/dist/tools/context-levels/l3.d.ts.map +1 -0
- package/dist/tools/context-levels/l3.js +30 -0
- package/dist/tools/context-levels/l3.js.map +1 -0
- package/dist/tools/context-levels/shared.d.ts +2 -0
- package/dist/tools/context-levels/shared.d.ts.map +1 -0
- package/dist/tools/context-levels/shared.js +4 -0
- package/dist/tools/context-levels/shared.js.map +1 -0
- package/dist/tools/context-levels/types.d.ts +34 -0
- package/dist/tools/context-levels/types.d.ts.map +1 -0
- package/dist/tools/context-levels/types.js +2 -0
- package/dist/tools/context-levels/types.js.map +1 -0
- package/dist/tools/context-tools.d.ts +2 -34
- package/dist/tools/context-tools.d.ts.map +1 -1
- package/dist/tools/context-tools.js +11 -127
- package/dist/tools/context-tools.js.map +1 -1
- package/dist/tools/conversation-cache.d.ts +6 -0
- package/dist/tools/conversation-cache.d.ts.map +1 -0
- package/dist/tools/conversation-cache.js +29 -0
- package/dist/tools/conversation-cache.js.map +1 -0
- package/dist/tools/conversation-index-tools.d.ts +39 -0
- package/dist/tools/conversation-index-tools.d.ts.map +1 -0
- package/dist/tools/conversation-index-tools.js +136 -0
- package/dist/tools/conversation-index-tools.js.map +1 -0
- package/dist/tools/conversation-paths.d.ts +4 -0
- package/dist/tools/conversation-paths.d.ts.map +1 -0
- package/dist/tools/conversation-paths.js +15 -0
- package/dist/tools/conversation-paths.js.map +1 -0
- package/dist/tools/conversation-search-tools.d.ts +52 -0
- package/dist/tools/conversation-search-tools.d.ts.map +1 -0
- package/dist/tools/conversation-search-tools.js +229 -0
- package/dist/tools/conversation-search-tools.js.map +1 -0
- package/dist/tools/conversation-tools.d.ts +6 -112
- package/dist/tools/conversation-tools.d.ts.map +1 -1
- package/dist/tools/conversation-tools.js +4 -425
- package/dist/tools/conversation-tools.js.map +1 -1
- package/dist/tools/cross-repo-outbound-lexer/call-detectors.d.ts +5 -0
- package/dist/tools/cross-repo-outbound-lexer/call-detectors.d.ts.map +1 -0
- package/dist/tools/cross-repo-outbound-lexer/call-detectors.js +76 -0
- package/dist/tools/cross-repo-outbound-lexer/call-detectors.js.map +1 -0
- package/dist/tools/cross-repo-outbound-lexer/context.d.ts +18 -0
- package/dist/tools/cross-repo-outbound-lexer/context.d.ts.map +1 -0
- package/dist/tools/cross-repo-outbound-lexer/context.js +33 -0
- package/dist/tools/cross-repo-outbound-lexer/context.js.map +1 -0
- package/dist/tools/cross-repo-outbound-lexer/literal-readers.d.ts +6 -0
- package/dist/tools/cross-repo-outbound-lexer/literal-readers.d.ts.map +1 -0
- package/dist/tools/cross-repo-outbound-lexer/literal-readers.js +65 -0
- package/dist/tools/cross-repo-outbound-lexer/literal-readers.js.map +1 -0
- package/dist/tools/cross-repo-outbound-lexer/non-code-states.d.ts +3 -0
- package/dist/tools/cross-repo-outbound-lexer/non-code-states.d.ts.map +1 -0
- package/dist/tools/cross-repo-outbound-lexer/non-code-states.js +103 -0
- package/dist/tools/cross-repo-outbound-lexer/non-code-states.js.map +1 -0
- package/dist/tools/cross-repo-outbound-lexer/template-reader.d.ts +3 -0
- package/dist/tools/cross-repo-outbound-lexer/template-reader.d.ts.map +1 -0
- package/dist/tools/cross-repo-outbound-lexer/template-reader.js +82 -0
- package/dist/tools/cross-repo-outbound-lexer/template-reader.js.map +1 -0
- package/dist/tools/cross-repo-outbound-lexer/types.d.ts +18 -0
- package/dist/tools/cross-repo-outbound-lexer/types.d.ts.map +1 -0
- package/dist/tools/cross-repo-outbound-lexer/types.js +2 -0
- package/dist/tools/cross-repo-outbound-lexer/types.js.map +1 -0
- package/dist/tools/cross-repo-outbound-lexer.d.ts +5 -31
- package/dist/tools/cross-repo-outbound-lexer.d.ts.map +1 -1
- package/dist/tools/cross-repo-outbound-lexer.js +75 -575
- package/dist/tools/cross-repo-outbound-lexer.js.map +1 -1
- package/dist/tools/dependency-audit-freshness-tools.d.ts +3 -0
- package/dist/tools/dependency-audit-freshness-tools.d.ts.map +1 -0
- package/dist/tools/dependency-audit-freshness-tools.js +62 -0
- package/dist/tools/dependency-audit-freshness-tools.js.map +1 -0
- package/dist/tools/dependency-audit-license-tools.d.ts +5 -0
- package/dist/tools/dependency-audit-license-tools.d.ts.map +1 -0
- package/dist/tools/dependency-audit-license-tools.js +75 -0
- package/dist/tools/dependency-audit-license-tools.js.map +1 -0
- package/dist/tools/dependency-audit-lockfile-tools.d.ts +3 -0
- package/dist/tools/dependency-audit-lockfile-tools.d.ts.map +1 -0
- package/dist/tools/dependency-audit-lockfile-tools.js +147 -0
- package/dist/tools/dependency-audit-lockfile-tools.js.map +1 -0
- package/dist/tools/dependency-audit-tools.d.ts +2 -54
- package/dist/tools/dependency-audit-tools.d.ts.map +1 -1
- package/dist/tools/dependency-audit-tools.js +69 -484
- package/dist/tools/dependency-audit-tools.js.map +1 -1
- package/dist/tools/dependency-audit-types.d.ts +65 -0
- package/dist/tools/dependency-audit-types.d.ts.map +1 -0
- package/dist/tools/dependency-audit-types.js +19 -0
- package/dist/tools/dependency-audit-types.js.map +1 -0
- package/dist/tools/dependency-audit-vulnerability-tools.d.ts +4 -0
- package/dist/tools/dependency-audit-vulnerability-tools.d.ts.map +1 -0
- package/dist/tools/dependency-audit-vulnerability-tools.js +103 -0
- package/dist/tools/dependency-audit-vulnerability-tools.js.map +1 -0
- package/dist/tools/diff-tools.d.ts.map +1 -1
- package/dist/tools/diff-tools.js +5 -7
- package/dist/tools/diff-tools.js.map +1 -1
- package/dist/tools/impact-tools.d.ts.map +1 -1
- package/dist/tools/impact-tools.js +5 -4
- package/dist/tools/impact-tools.js.map +1 -1
- package/dist/tools/index-shared.d.ts +17 -0
- package/dist/tools/index-shared.d.ts.map +1 -0
- package/dist/tools/index-shared.js +18 -0
- package/dist/tools/index-shared.js.map +1 -0
- package/dist/tools/index-tools/file-indexer.d.ts +27 -0
- package/dist/tools/index-tools/file-indexer.d.ts.map +1 -0
- package/dist/tools/index-tools/file-indexer.js +223 -0
- package/dist/tools/index-tools/file-indexer.js.map +1 -0
- package/dist/tools/index-tools/folder-indexer.d.ts +21 -0
- package/dist/tools/index-tools/folder-indexer.d.ts.map +1 -0
- package/dist/tools/index-tools/folder-indexer.js +399 -0
- package/dist/tools/index-tools/folder-indexer.js.map +1 -0
- package/dist/tools/index-tools/folder-merge.d.ts +23 -0
- package/dist/tools/index-tools/folder-merge.d.ts.map +1 -0
- package/dist/tools/index-tools/folder-merge.js +205 -0
- package/dist/tools/index-tools/folder-merge.js.map +1 -0
- package/dist/tools/index-tools/parse.d.ts +35 -0
- package/dist/tools/index-tools/parse.d.ts.map +1 -0
- package/dist/tools/index-tools/parse.js +262 -0
- package/dist/tools/index-tools/parse.js.map +1 -0
- package/dist/tools/index-tools/registry.d.ts +40 -0
- package/dist/tools/index-tools/registry.d.ts.map +1 -0
- package/dist/tools/index-tools/registry.js +258 -0
- package/dist/tools/index-tools/registry.js.map +1 -0
- package/dist/tools/index-tools/snapshots.d.ts +51 -0
- package/dist/tools/index-tools/snapshots.d.ts.map +1 -0
- package/dist/tools/index-tools/snapshots.js +223 -0
- package/dist/tools/index-tools/snapshots.js.map +1 -0
- package/dist/tools/index-tools/state.d.ts +8 -0
- package/dist/tools/index-tools/state.d.ts.map +1 -0
- package/dist/tools/index-tools/state.js +6 -0
- package/dist/tools/index-tools/state.js.map +1 -0
- package/dist/tools/index-tools/types.d.ts +20 -0
- package/dist/tools/index-tools/types.d.ts.map +1 -0
- package/dist/tools/index-tools/types.js +2 -0
- package/dist/tools/index-tools/types.js.map +1 -0
- package/dist/tools/index-tools/watcher.d.ts +10 -0
- package/dist/tools/index-tools/watcher.d.ts.map +1 -0
- package/dist/tools/index-tools/watcher.js +130 -0
- package/dist/tools/index-tools/watcher.js.map +1 -0
- package/dist/tools/index-tools.d.ts +16 -152
- package/dist/tools/index-tools.d.ts.map +1 -1
- package/dist/tools/index-tools.js +12 -1674
- package/dist/tools/index-tools.js.map +1 -1
- package/dist/tools/kotlin-extension-tools.d.ts +16 -0
- package/dist/tools/kotlin-extension-tools.d.ts.map +1 -0
- package/dist/tools/kotlin-extension-tools.js +31 -0
- package/dist/tools/kotlin-extension-tools.js.map +1 -0
- package/dist/tools/kotlin-flow-tools.d.ts +12 -0
- package/dist/tools/kotlin-flow-tools.d.ts.map +1 -0
- package/dist/tools/kotlin-flow-tools.js +72 -0
- package/dist/tools/kotlin-flow-tools.js.map +1 -0
- package/dist/tools/kotlin-kmp-tools.d.ts +29 -0
- package/dist/tools/kotlin-kmp-tools.d.ts.map +1 -0
- package/dist/tools/kotlin-kmp-tools.js +87 -0
- package/dist/tools/kotlin-kmp-tools.js.map +1 -0
- package/dist/tools/kotlin-sealed-tools.d.ts +27 -0
- package/dist/tools/kotlin-sealed-tools.d.ts.map +1 -0
- package/dist/tools/kotlin-sealed-tools.js +130 -0
- package/dist/tools/kotlin-sealed-tools.js.map +1 -0
- package/dist/tools/kotlin-suspend-tools.d.ts +24 -0
- package/dist/tools/kotlin-suspend-tools.d.ts.map +1 -0
- package/dist/tools/kotlin-suspend-tools.js +161 -0
- package/dist/tools/kotlin-suspend-tools.js.map +1 -0
- package/dist/tools/kotlin-tools.d.ts +6 -141
- package/dist/tools/kotlin-tools.d.ts.map +1 -1
- package/dist/tools/kotlin-tools.js +6 -571
- package/dist/tools/kotlin-tools.js.map +1 -1
- package/dist/tools/nest-audit-tools.d.ts +43 -0
- package/dist/tools/nest-audit-tools.d.ts.map +1 -0
- package/dist/tools/nest-audit-tools.js +232 -0
- package/dist/tools/nest-audit-tools.js.map +1 -0
- package/dist/tools/nest-di-tools.d.ts +32 -0
- package/dist/tools/nest-di-tools.d.ts.map +1 -0
- package/dist/tools/nest-di-tools.js +161 -0
- package/dist/tools/nest-di-tools.js.map +1 -0
- package/dist/tools/nest-guard-tools.d.ts +34 -0
- package/dist/tools/nest-guard-tools.d.ts.map +1 -0
- package/dist/tools/nest-guard-tools.js +240 -0
- package/dist/tools/nest-guard-tools.js.map +1 -0
- package/dist/tools/nest-lifecycle-tools.d.ts +16 -0
- package/dist/tools/nest-lifecycle-tools.d.ts.map +1 -0
- package/dist/tools/nest-lifecycle-tools.js +54 -0
- package/dist/tools/nest-lifecycle-tools.js.map +1 -0
- package/dist/tools/nest-module-tools.d.ts +28 -0
- package/dist/tools/nest-module-tools.d.ts.map +1 -0
- package/dist/tools/nest-module-tools.js +86 -0
- package/dist/tools/nest-module-tools.js.map +1 -0
- package/dist/tools/nest-pipeline-tools.d.ts +32 -0
- package/dist/tools/nest-pipeline-tools.d.ts.map +1 -0
- package/dist/tools/nest-pipeline-tools.js +122 -0
- package/dist/tools/nest-pipeline-tools.js.map +1 -0
- package/dist/tools/nest-route-tools.d.ts +43 -0
- package/dist/tools/nest-route-tools.d.ts.map +1 -0
- package/dist/tools/nest-route-tools.js +261 -0
- package/dist/tools/nest-route-tools.js.map +1 -0
- package/dist/tools/nest-shared-tools.d.ts +13 -0
- package/dist/tools/nest-shared-tools.d.ts.map +1 -0
- package/dist/tools/nest-shared-tools.js +36 -0
- package/dist/tools/nest-shared-tools.js.map +1 -0
- package/dist/tools/nest-tools.d.ts +18 -195
- package/dist/tools/nest-tools.d.ts.map +1 -1
- package/dist/tools/nest-tools.js +11 -1140
- package/dist/tools/nest-tools.js.map +1 -1
- package/dist/tools/pattern-registry.d.ts +4 -0
- package/dist/tools/pattern-registry.d.ts.map +1 -0
- package/dist/tools/pattern-registry.js +3 -0
- package/dist/tools/pattern-registry.js.map +1 -0
- package/dist/tools/pattern-tools.d.ts +5 -46
- package/dist/tools/pattern-tools.d.ts.map +1 -1
- package/dist/tools/pattern-tools.js +4 -1102
- package/dist/tools/pattern-tools.js.map +1 -1
- package/dist/tools/patterns/adapters/astro.d.ts +3 -0
- package/dist/tools/patterns/adapters/astro.d.ts.map +1 -0
- package/dist/tools/patterns/adapters/astro.js +56 -0
- package/dist/tools/patterns/adapters/astro.js.map +1 -0
- package/dist/tools/patterns/adapters/common.d.ts +3 -0
- package/dist/tools/patterns/adapters/common.d.ts.map +1 -0
- package/dist/tools/patterns/adapters/common.js +38 -0
- package/dist/tools/patterns/adapters/common.js.map +1 -0
- package/dist/tools/patterns/adapters/database.d.ts +3 -0
- package/dist/tools/patterns/adapters/database.d.ts.map +1 -0
- package/dist/tools/patterns/adapters/database.js +32 -0
- package/dist/tools/patterns/adapters/database.js.map +1 -0
- package/dist/tools/patterns/adapters/hono.d.ts +3 -0
- package/dist/tools/patterns/adapters/hono.d.ts.map +1 -0
- package/dist/tools/patterns/adapters/hono.js +32 -0
- package/dist/tools/patterns/adapters/hono.js.map +1 -0
- package/dist/tools/patterns/adapters/kotlin.d.ts +3 -0
- package/dist/tools/patterns/adapters/kotlin.d.ts.map +1 -0
- package/dist/tools/patterns/adapters/kotlin.js +50 -0
- package/dist/tools/patterns/adapters/kotlin.js.map +1 -0
- package/dist/tools/patterns/adapters/nest.d.ts +3 -0
- package/dist/tools/patterns/adapters/nest.d.ts.map +1 -0
- package/dist/tools/patterns/adapters/nest.js +122 -0
- package/dist/tools/patterns/adapters/nest.js.map +1 -0
- package/dist/tools/patterns/adapters/nextjs.d.ts +4 -0
- package/dist/tools/patterns/adapters/nextjs.d.ts.map +1 -0
- package/dist/tools/patterns/adapters/nextjs.js +59 -0
- package/dist/tools/patterns/adapters/nextjs.js.map +1 -0
- package/dist/tools/patterns/adapters/php.d.ts +3 -0
- package/dist/tools/patterns/adapters/php.d.ts.map +1 -0
- package/dist/tools/patterns/adapters/php.js +157 -0
- package/dist/tools/patterns/adapters/php.js.map +1 -0
- package/dist/tools/patterns/adapters/python.d.ts +3 -0
- package/dist/tools/patterns/adapters/python.d.ts.map +1 -0
- package/dist/tools/patterns/adapters/python.js +72 -0
- package/dist/tools/patterns/adapters/python.js.map +1 -0
- package/dist/tools/patterns/adapters/react.d.ts +4 -0
- package/dist/tools/patterns/adapters/react.d.ts.map +1 -0
- package/dist/tools/patterns/adapters/react.js +345 -0
- package/dist/tools/patterns/adapters/react.js.map +1 -0
- package/dist/tools/patterns/catalog.d.ts +8 -0
- package/dist/tools/patterns/catalog.d.ts.map +1 -0
- package/dist/tools/patterns/catalog.js +30 -0
- package/dist/tools/patterns/catalog.js.map +1 -0
- package/dist/tools/patterns/execution.d.ts +38 -0
- package/dist/tools/patterns/execution.d.ts.map +1 -0
- package/dist/tools/patterns/execution.js +298 -0
- package/dist/tools/patterns/execution.js.map +1 -0
- package/dist/tools/patterns/types.d.ts +13 -0
- package/dist/tools/patterns/types.d.ts.map +1 -0
- package/dist/tools/patterns/types.js +2 -0
- package/dist/tools/patterns/types.js.map +1 -0
- package/dist/tools/pg-drift-compare.d.ts +3 -0
- package/dist/tools/pg-drift-compare.d.ts.map +1 -0
- package/dist/tools/pg-drift-compare.js +30 -0
- package/dist/tools/pg-drift-compare.js.map +1 -0
- package/dist/tools/pg-drift-schema.d.ts +5 -0
- package/dist/tools/pg-drift-schema.d.ts.map +1 -0
- package/dist/tools/pg-drift-schema.js +28 -0
- package/dist/tools/pg-drift-schema.js.map +1 -0
- package/dist/tools/pg-drift-types.d.ts +25 -0
- package/dist/tools/pg-drift-types.d.ts.map +1 -0
- package/dist/tools/pg-drift-types.js +2 -0
- package/dist/tools/pg-drift-types.js.map +1 -0
- package/dist/tools/pg-drift.d.ts +5 -0
- package/dist/tools/pg-drift.d.ts.map +1 -0
- package/dist/tools/pg-drift.js +30 -0
- package/dist/tools/pg-drift.js.map +1 -0
- package/dist/tools/pg-introspect-formatters.d.ts +7 -0
- package/dist/tools/pg-introspect-formatters.d.ts.map +1 -0
- package/dist/tools/pg-introspect-formatters.js +66 -0
- package/dist/tools/pg-introspect-formatters.js.map +1 -0
- package/dist/tools/pg-introspect-tools.d.ts +5 -146
- package/dist/tools/pg-introspect-tools.d.ts.map +1 -1
- package/dist/tools/pg-introspect-tools.js +3 -395
- package/dist/tools/pg-introspect-tools.js.map +1 -1
- package/dist/tools/pg-introspection.d.ts +90 -0
- package/dist/tools/pg-introspection.d.ts.map +1 -0
- package/dist/tools/pg-introspection.js +288 -0
- package/dist/tools/pg-introspection.js.map +1 -0
- package/dist/tools/php-active-record-tools.d.ts +22 -0
- package/dist/tools/php-active-record-tools.d.ts.map +1 -0
- package/dist/tools/php-active-record-tools.js +165 -0
- package/dist/tools/php-active-record-tools.js.map +1 -0
- package/dist/tools/php-event-tools.d.ts +21 -0
- package/dist/tools/php-event-tools.d.ts.map +1 -0
- package/dist/tools/php-event-tools.js +205 -0
- package/dist/tools/php-event-tools.js.map +1 -0
- package/dist/tools/php-god-model-tools.d.ts +34 -0
- package/dist/tools/php-god-model-tools.d.ts.map +1 -0
- package/dist/tools/php-god-model-tools.js +88 -0
- package/dist/tools/php-god-model-tools.js.map +1 -0
- package/dist/tools/php-import-utils.d.ts +10 -0
- package/dist/tools/php-import-utils.d.ts.map +1 -0
- package/dist/tools/php-import-utils.js +71 -0
- package/dist/tools/php-import-utils.js.map +1 -0
- package/dist/tools/php-namespace-tools.d.ts +10 -0
- package/dist/tools/php-namespace-tools.d.ts.map +1 -0
- package/dist/tools/php-namespace-tools.js +98 -0
- package/dist/tools/php-namespace-tools.js.map +1 -0
- package/dist/tools/php-nplus1-tools.d.ts +27 -0
- package/dist/tools/php-nplus1-tools.d.ts.map +1 -0
- package/dist/tools/php-nplus1-tools.js +191 -0
- package/dist/tools/php-nplus1-tools.js.map +1 -0
- package/dist/tools/php-project-audit-tools.d.ts +31 -0
- package/dist/tools/php-project-audit-tools.d.ts.map +1 -0
- package/dist/tools/php-project-audit-tools.js +173 -0
- package/dist/tools/php-project-audit-tools.js.map +1 -0
- package/dist/tools/php-security-tools.d.ts +24 -0
- package/dist/tools/php-security-tools.d.ts.map +1 -0
- package/dist/tools/php-security-tools.js +172 -0
- package/dist/tools/php-security-tools.js.map +1 -0
- package/dist/tools/php-service-tools.d.ts +25 -0
- package/dist/tools/php-service-tools.d.ts.map +1 -0
- package/dist/tools/php-service-tools.js +326 -0
- package/dist/tools/php-service-tools.js.map +1 -0
- package/dist/tools/php-tools.d.ts +21 -255
- package/dist/tools/php-tools.d.ts.map +1 -1
- package/dist/tools/php-tools.js +12 -1423
- package/dist/tools/php-tools.js.map +1 -1
- package/dist/tools/php-view-tools.d.ts +76 -0
- package/dist/tools/php-view-tools.d.ts.map +1 -0
- package/dist/tools/php-view-tools.js +413 -0
- package/dist/tools/php-view-tools.js.map +1 -0
- package/dist/tools/plan-turn/formatter.d.ts +3 -0
- package/dist/tools/plan-turn/formatter.d.ts.map +1 -0
- package/dist/tools/plan-turn/formatter.js +88 -0
- package/dist/tools/plan-turn/formatter.js.map +1 -0
- package/dist/tools/plan-turn/framework-context.d.ts +5 -0
- package/dist/tools/plan-turn/framework-context.d.ts.map +1 -0
- package/dist/tools/plan-turn/framework-context.js +68 -0
- package/dist/tools/plan-turn/framework-context.js.map +1 -0
- package/dist/tools/plan-turn/framework-data.d.ts +5 -0
- package/dist/tools/plan-turn/framework-data.d.ts.map +1 -0
- package/dist/tools/plan-turn/framework-data.js +48 -0
- package/dist/tools/plan-turn/framework-data.js.map +1 -0
- package/dist/tools/plan-turn/orchestrator.d.ts +4 -0
- package/dist/tools/plan-turn/orchestrator.d.ts.map +1 -0
- package/dist/tools/plan-turn/orchestrator.js +262 -0
- package/dist/tools/plan-turn/orchestrator.js.map +1 -0
- package/dist/tools/plan-turn/query-parser.d.ts +6 -0
- package/dist/tools/plan-turn/query-parser.d.ts.map +1 -0
- package/dist/tools/plan-turn/query-parser.js +60 -0
- package/dist/tools/plan-turn/query-parser.js.map +1 -0
- package/dist/tools/plan-turn/recommendations.d.ts +11 -0
- package/dist/tools/plan-turn/recommendations.d.ts.map +1 -0
- package/dist/tools/plan-turn/recommendations.js +93 -0
- package/dist/tools/plan-turn/recommendations.js.map +1 -0
- package/dist/tools/plan-turn/stale-index.d.ts +4 -0
- package/dist/tools/plan-turn/stale-index.d.ts.map +1 -0
- package/dist/tools/plan-turn/stale-index.js +17 -0
- package/dist/tools/plan-turn/stale-index.js.map +1 -0
- package/dist/tools/plan-turn/types.d.ts +61 -0
- package/dist/tools/plan-turn/types.d.ts.map +1 -0
- package/dist/tools/plan-turn/types.js +2 -0
- package/dist/tools/plan-turn/types.js.map +1 -0
- package/dist/tools/plan-turn-tools.d.ts +8 -111
- package/dist/tools/plan-turn-tools.d.ts.map +1 -1
- package/dist/tools/plan-turn-tools.js +6 -696
- package/dist/tools/plan-turn-tools.js.map +1 -1
- package/dist/tools/project-profile-express.d.ts +3 -0
- package/dist/tools/project-profile-express.d.ts.map +1 -0
- package/dist/tools/project-profile-express.js +46 -0
- package/dist/tools/project-profile-express.js.map +1 -0
- package/dist/tools/project-profile-extractors.d.ts +9 -0
- package/dist/tools/project-profile-extractors.d.ts.map +1 -0
- package/dist/tools/project-profile-extractors.js +312 -0
- package/dist/tools/project-profile-extractors.js.map +1 -0
- package/dist/tools/project-profile-fs.d.ts +3 -0
- package/dist/tools/project-profile-fs.d.ts.map +1 -0
- package/dist/tools/project-profile-fs.js +19 -0
- package/dist/tools/project-profile-fs.js.map +1 -0
- package/dist/tools/project-profile-hono.d.ts +13 -0
- package/dist/tools/project-profile-hono.d.ts.map +1 -0
- package/dist/tools/project-profile-hono.js +110 -0
- package/dist/tools/project-profile-hono.js.map +1 -0
- package/dist/tools/project-profile-imports.d.ts +6 -0
- package/dist/tools/project-profile-imports.d.ts.map +1 -0
- package/dist/tools/project-profile-imports.js +95 -0
- package/dist/tools/project-profile-imports.js.map +1 -0
- package/dist/tools/project-profile-nest.d.ts +8 -0
- package/dist/tools/project-profile-nest.d.ts.map +1 -0
- package/dist/tools/project-profile-nest.js +352 -0
- package/dist/tools/project-profile-nest.js.map +1 -0
- package/dist/tools/project-profile-next.d.ts +5 -0
- package/dist/tools/project-profile-next.d.ts.map +1 -0
- package/dist/tools/project-profile-next.js +92 -0
- package/dist/tools/project-profile-next.js.map +1 -0
- package/dist/tools/project-profile-persistence.d.ts +3 -0
- package/dist/tools/project-profile-persistence.d.ts.map +1 -0
- package/dist/tools/project-profile-persistence.js +19 -0
- package/dist/tools/project-profile-persistence.js.map +1 -0
- package/dist/tools/project-profile-php.d.ts +8 -0
- package/dist/tools/project-profile-php.d.ts.map +1 -0
- package/dist/tools/project-profile-php.js +76 -0
- package/dist/tools/project-profile-php.js.map +1 -0
- package/dist/tools/project-profile-python.d.ts +5 -0
- package/dist/tools/project-profile-python.d.ts.map +1 -0
- package/dist/tools/project-profile-python.js +51 -0
- package/dist/tools/project-profile-python.js.map +1 -0
- package/dist/tools/project-profile-react.d.ts +6 -0
- package/dist/tools/project-profile-react.d.ts.map +1 -0
- package/dist/tools/project-profile-react.js +106 -0
- package/dist/tools/project-profile-react.js.map +1 -0
- package/dist/tools/project-profile-stack.d.ts +3 -0
- package/dist/tools/project-profile-stack.d.ts.map +1 -0
- package/dist/tools/project-profile-stack.js +354 -0
- package/dist/tools/project-profile-stack.js.map +1 -0
- package/dist/tools/project-profile-summary.d.ts +30 -0
- package/dist/tools/project-profile-summary.d.ts.map +1 -0
- package/dist/tools/project-profile-summary.js +112 -0
- package/dist/tools/project-profile-summary.js.map +1 -0
- package/dist/tools/project-profile-types.d.ts +315 -0
- package/dist/tools/project-profile-types.d.ts.map +1 -0
- package/dist/tools/project-profile-types.js +2 -0
- package/dist/tools/project-profile-types.js.map +1 -0
- package/dist/tools/project-tools.d.ts +20 -383
- package/dist/tools/project-tools.d.ts.map +1 -1
- package/dist/tools/project-tools.js +37 -1621
- package/dist/tools/project-tools.js.map +1 -1
- package/dist/tools/python-audit/aggregate.d.ts +3 -0
- package/dist/tools/python-audit/aggregate.d.ts.map +1 -0
- package/dist/tools/python-audit/aggregate.js +103 -0
- package/dist/tools/python-audit/aggregate.js.map +1 -0
- package/dist/tools/python-audit/checks/anti-patterns.d.ts +6 -0
- package/dist/tools/python-audit/checks/anti-patterns.d.ts.map +1 -0
- package/dist/tools/python-audit/checks/anti-patterns.js +14 -0
- package/dist/tools/python-audit/checks/anti-patterns.js.map +1 -0
- package/dist/tools/python-audit/checks/celery.d.ts +2 -0
- package/dist/tools/python-audit/checks/celery.d.ts.map +1 -0
- package/dist/tools/python-audit/checks/celery.js +5 -0
- package/dist/tools/python-audit/checks/celery.js.map +1 -0
- package/dist/tools/python-audit/checks/circular-imports.d.ts +2 -0
- package/dist/tools/python-audit/checks/circular-imports.d.ts.map +1 -0
- package/dist/tools/python-audit/checks/circular-imports.js +5 -0
- package/dist/tools/python-audit/checks/circular-imports.js.map +1 -0
- package/dist/tools/python-audit/checks/dead-code.d.ts +2 -0
- package/dist/tools/python-audit/checks/dead-code.d.ts.map +1 -0
- package/dist/tools/python-audit/checks/dead-code.js +5 -0
- package/dist/tools/python-audit/checks/dead-code.js.map +1 -0
- package/dist/tools/python-audit/checks/dependencies.d.ts +2 -0
- package/dist/tools/python-audit/checks/dependencies.d.ts.map +1 -0
- package/dist/tools/python-audit/checks/dependencies.js +5 -0
- package/dist/tools/python-audit/checks/dependencies.js.map +1 -0
- package/dist/tools/python-audit/checks/django-settings.d.ts +2 -0
- package/dist/tools/python-audit/checks/django-settings.d.ts.map +1 -0
- package/dist/tools/python-audit/checks/django-settings.js +5 -0
- package/dist/tools/python-audit/checks/django-settings.js.map +1 -0
- package/dist/tools/python-audit/checks/framework-wiring.d.ts +2 -0
- package/dist/tools/python-audit/checks/framework-wiring.d.ts.map +1 -0
- package/dist/tools/python-audit/checks/framework-wiring.js +5 -0
- package/dist/tools/python-audit/checks/framework-wiring.js.map +1 -0
- package/dist/tools/python-audit/checks/pytest-fixtures.d.ts +2 -0
- package/dist/tools/python-audit/checks/pytest-fixtures.d.ts.map +1 -0
- package/dist/tools/python-audit/checks/pytest-fixtures.js +5 -0
- package/dist/tools/python-audit/checks/pytest-fixtures.js.map +1 -0
- package/dist/tools/python-audit/runner.d.ts +5 -0
- package/dist/tools/python-audit/runner.d.ts.map +1 -0
- package/dist/tools/python-audit/runner.js +18 -0
- package/dist/tools/python-audit/runner.js.map +1 -0
- package/dist/tools/python-audit/types.d.ts +43 -0
- package/dist/tools/python-audit/types.d.ts.map +1 -0
- package/dist/tools/python-audit/types.js +2 -0
- package/dist/tools/python-audit/types.js.map +1 -0
- package/dist/tools/python-audit.d.ts +3 -39
- package/dist/tools/python-audit.d.ts.map +1 -1
- package/dist/tools/python-audit.js +34 -233
- package/dist/tools/python-audit.js.map +1 -1
- package/dist/tools/react-compiler-tools.d.ts +37 -0
- package/dist/tools/react-compiler-tools.d.ts.map +1 -0
- package/dist/tools/react-compiler-tools.js +104 -0
- package/dist/tools/react-compiler-tools.js.map +1 -0
- package/dist/tools/react-component-tree-tools.d.ts +58 -0
- package/dist/tools/react-component-tree-tools.d.ts.map +1 -0
- package/dist/tools/react-component-tree-tools.js +292 -0
- package/dist/tools/react-component-tree-tools.js.map +1 -0
- package/dist/tools/react-context-tools.d.ts +41 -0
- package/dist/tools/react-context-tools.d.ts.map +1 -0
- package/dist/tools/react-context-tools.js +76 -0
- package/dist/tools/react-context-tools.js.map +1 -0
- package/dist/tools/react-hooks-tools.d.ts +58 -0
- package/dist/tools/react-hooks-tools.d.ts.map +1 -0
- package/dist/tools/react-hooks-tools.js +144 -0
- package/dist/tools/react-hooks-tools.js.map +1 -0
- package/dist/tools/react-quickstart-tools.d.ts +59 -0
- package/dist/tools/react-quickstart-tools.d.ts.map +1 -0
- package/dist/tools/react-quickstart-tools.js +164 -0
- package/dist/tools/react-quickstart-tools.js.map +1 -0
- package/dist/tools/react-render-tools.d.ts +75 -0
- package/dist/tools/react-render-tools.d.ts.map +1 -0
- package/dist/tools/react-render-tools.js +234 -0
- package/dist/tools/react-render-tools.js.map +1 -0
- package/dist/tools/react-shared-tools.d.ts +5 -0
- package/dist/tools/react-shared-tools.d.ts.map +1 -0
- package/dist/tools/react-shared-tools.js +12 -0
- package/dist/tools/react-shared-tools.js.map +1 -0
- package/dist/tools/react-suspense-tools.d.ts +29 -0
- package/dist/tools/react-suspense-tools.d.ts.map +1 -0
- package/dist/tools/react-suspense-tools.js +269 -0
- package/dist/tools/react-suspense-tools.js.map +1 -0
- package/dist/tools/react-tools.d.ts +19 -340
- package/dist/tools/react-tools.d.ts.map +1 -1
- package/dist/tools/react-tools.js +10 -1263
- package/dist/tools/react-tools.js.map +1 -1
- package/dist/tools/review-diff/check-runner.d.ts +5 -0
- package/dist/tools/review-diff/check-runner.d.ts.map +1 -0
- package/dist/tools/review-diff/check-runner.js +26 -0
- package/dist/tools/review-diff/check-runner.js.map +1 -0
- package/dist/tools/review-diff/checks/astro-hydration.d.ts +8 -0
- package/dist/tools/review-diff/checks/astro-hydration.d.ts.map +1 -0
- package/dist/tools/review-diff/checks/astro-hydration.js +54 -0
- package/dist/tools/review-diff/checks/astro-hydration.js.map +1 -0
- package/dist/tools/review-diff/checks/blast-radius.d.ts +7 -0
- package/dist/tools/review-diff/checks/blast-radius.d.ts.map +1 -0
- package/dist/tools/review-diff/checks/blast-radius.js +39 -0
- package/dist/tools/review-diff/checks/blast-radius.js.map +1 -0
- package/dist/tools/review-diff/checks/breaking.d.ts +13 -0
- package/dist/tools/review-diff/checks/breaking.d.ts.map +1 -0
- package/dist/tools/review-diff/checks/breaking.js +115 -0
- package/dist/tools/review-diff/checks/breaking.js.map +1 -0
- package/dist/tools/review-diff/checks/bug-patterns.d.ts +8 -0
- package/dist/tools/review-diff/checks/bug-patterns.d.ts.map +1 -0
- package/dist/tools/review-diff/checks/bug-patterns.js +130 -0
- package/dist/tools/review-diff/checks/bug-patterns.js.map +1 -0
- package/dist/tools/review-diff/checks/complexity.d.ts +8 -0
- package/dist/tools/review-diff/checks/complexity.d.ts.map +1 -0
- package/dist/tools/review-diff/checks/complexity.js +41 -0
- package/dist/tools/review-diff/checks/complexity.js.map +1 -0
- package/dist/tools/review-diff/checks/coupling.d.ts +7 -0
- package/dist/tools/review-diff/checks/coupling.d.ts.map +1 -0
- package/dist/tools/review-diff/checks/coupling.js +52 -0
- package/dist/tools/review-diff/checks/coupling.js.map +1 -0
- package/dist/tools/review-diff/checks/dead-code.d.ts +7 -0
- package/dist/tools/review-diff/checks/dead-code.d.ts.map +1 -0
- package/dist/tools/review-diff/checks/dead-code.js +39 -0
- package/dist/tools/review-diff/checks/dead-code.js.map +1 -0
- package/dist/tools/review-diff/checks/hotspots.d.ts +8 -0
- package/dist/tools/review-diff/checks/hotspots.d.ts.map +1 -0
- package/dist/tools/review-diff/checks/hotspots.js +39 -0
- package/dist/tools/review-diff/checks/hotspots.js.map +1 -0
- package/dist/tools/review-diff/checks/secrets.d.ts +7 -0
- package/dist/tools/review-diff/checks/secrets.d.ts.map +1 -0
- package/dist/tools/review-diff/checks/secrets.js +38 -0
- package/dist/tools/review-diff/checks/secrets.js.map +1 -0
- package/dist/tools/review-diff/checks/test-gaps.d.ts +16 -0
- package/dist/tools/review-diff/checks/test-gaps.d.ts.map +1 -0
- package/dist/tools/review-diff/checks/test-gaps.js +77 -0
- package/dist/tools/review-diff/checks/test-gaps.js.map +1 -0
- package/dist/tools/review-diff/constants.d.ts +6 -0
- package/dist/tools/review-diff/constants.d.ts.map +1 -0
- package/dist/tools/review-diff/constants.js +16 -0
- package/dist/tools/review-diff/constants.js.map +1 -0
- package/dist/tools/review-diff/file-pattern.d.ts +2 -0
- package/dist/tools/review-diff/file-pattern.d.ts.map +1 -0
- package/dist/tools/review-diff/file-pattern.js +9 -0
- package/dist/tools/review-diff/file-pattern.js.map +1 -0
- package/dist/tools/review-diff/orchestrator.d.ts +3 -0
- package/dist/tools/review-diff/orchestrator.d.ts.map +1 -0
- package/dist/tools/review-diff/orchestrator.js +173 -0
- package/dist/tools/review-diff/orchestrator.js.map +1 -0
- package/dist/tools/review-diff/scoring.d.ts +31 -0
- package/dist/tools/review-diff/scoring.d.ts.map +1 -0
- package/dist/tools/review-diff/scoring.js +82 -0
- package/dist/tools/review-diff/scoring.js.map +1 -0
- package/dist/tools/review-diff/timeout.d.ts +5 -0
- package/dist/tools/review-diff/timeout.d.ts.map +1 -0
- package/dist/tools/review-diff/timeout.js +14 -0
- package/dist/tools/review-diff/timeout.js.map +1 -0
- package/dist/tools/review-diff/types.d.ts +56 -0
- package/dist/tools/review-diff/types.d.ts.map +1 -0
- package/dist/tools/review-diff/types.js +2 -0
- package/dist/tools/review-diff/types.js.map +1 -0
- package/dist/tools/review-diff-tools.d.ts +19 -147
- package/dist/tools/review-diff-tools.d.ts.map +1 -1
- package/dist/tools/review-diff-tools.js +18 -941
- package/dist/tools/review-diff-tools.js.map +1 -1
- package/dist/tools/route-shared.d.ts +6 -0
- package/dist/tools/route-shared.d.ts.map +1 -0
- package/dist/tools/route-shared.js +37 -0
- package/dist/tools/route-shared.js.map +1 -0
- package/dist/tools/route-tools.d.ts +1 -7
- package/dist/tools/route-tools.d.ts.map +1 -1
- package/dist/tools/route-tools.js +2 -22
- package/dist/tools/route-tools.js.map +1 -1
- package/dist/tools/search-tools/constants.d.ts +33 -0
- package/dist/tools/search-tools/constants.d.ts.map +1 -0
- package/dist/tools/search-tools/constants.js +54 -0
- package/dist/tools/search-tools/constants.js.map +1 -0
- package/dist/tools/search-tools/ripgrep.d.ts +13 -0
- package/dist/tools/search-tools/ripgrep.d.ts.map +1 -0
- package/dist/tools/search-tools/ripgrep.js +138 -0
- package/dist/tools/search-tools/ripgrep.js.map +1 -0
- package/dist/tools/search-tools/semantic-search.d.ts +9 -0
- package/dist/tools/search-tools/semantic-search.d.ts.map +1 -0
- package/dist/tools/search-tools/semantic-search.js +19 -0
- package/dist/tools/search-tools/semantic-search.js.map +1 -0
- package/dist/tools/search-tools/symbol-search.d.ts +4 -0
- package/dist/tools/search-tools/symbol-search.d.ts.map +1 -0
- package/dist/tools/search-tools/symbol-search.js +146 -0
- package/dist/tools/search-tools/symbol-search.js.map +1 -0
- package/dist/tools/search-tools/text-search.d.ts +10 -0
- package/dist/tools/search-tools/text-search.d.ts.map +1 -0
- package/dist/tools/search-tools/text-search.js +260 -0
- package/dist/tools/search-tools/text-search.js.map +1 -0
- package/dist/tools/search-tools/types.d.ts +28 -0
- package/dist/tools/search-tools/types.d.ts.map +1 -0
- package/dist/tools/search-tools/types.js +2 -0
- package/dist/tools/search-tools/types.js.map +1 -0
- package/dist/tools/search-tools/zero-hit.d.ts +3 -0
- package/dist/tools/search-tools/zero-hit.d.ts.map +1 -0
- package/dist/tools/search-tools/zero-hit.js +92 -0
- package/dist/tools/search-tools/zero-hit.js.map +1 -0
- package/dist/tools/search-tools.d.ts +5 -64
- package/dist/tools/search-tools.d.ts.map +1 -1
- package/dist/tools/search-tools.js +4 -770
- package/dist/tools/search-tools.js.map +1 -1
- package/dist/tools/secret-detectors.d.ts +12 -0
- package/dist/tools/secret-detectors.d.ts.map +1 -0
- package/dist/tools/secret-detectors.js +86 -0
- package/dist/tools/secret-detectors.js.map +1 -0
- package/dist/tools/secret-file-scanner.d.ts +7 -0
- package/dist/tools/secret-file-scanner.d.ts.map +1 -0
- package/dist/tools/secret-file-scanner.js +52 -0
- package/dist/tools/secret-file-scanner.js.map +1 -0
- package/dist/tools/secret-scan-cache.d.ts +6 -0
- package/dist/tools/secret-scan-cache.d.ts.map +1 -0
- package/dist/tools/secret-scan-cache.js +14 -0
- package/dist/tools/secret-scan-cache.js.map +1 -0
- package/dist/tools/secret-scan-shared.d.ts +5 -0
- package/dist/tools/secret-scan-shared.d.ts.map +1 -0
- package/dist/tools/secret-scan-shared.js +4 -0
- package/dist/tools/secret-scan-shared.js.map +1 -0
- package/dist/tools/secret-scan-types.d.ts +21 -0
- package/dist/tools/secret-scan-types.d.ts.map +1 -0
- package/dist/tools/secret-scan-types.js +2 -0
- package/dist/tools/secret-scan-types.js.map +1 -0
- package/dist/tools/secret-tools.d.ts +3 -75
- package/dist/tools/secret-tools.d.ts.map +1 -1
- package/dist/tools/secret-tools.js +4 -316
- package/dist/tools/secret-tools.js.map +1 -1
- package/dist/tools/sql-audit-tools.d.ts +42 -0
- package/dist/tools/sql-audit-tools.d.ts.map +1 -0
- package/dist/tools/sql-audit-tools.js +130 -0
- package/dist/tools/sql-audit-tools.js.map +1 -0
- package/dist/tools/sql-column-tools.d.ts +28 -0
- package/dist/tools/sql-column-tools.d.ts.map +1 -0
- package/dist/tools/sql-column-tools.js +58 -0
- package/dist/tools/sql-column-tools.js.map +1 -0
- package/dist/tools/sql-complexity-tools.d.ts +22 -0
- package/dist/tools/sql-complexity-tools.d.ts.map +1 -0
- package/dist/tools/sql-complexity-tools.js +60 -0
- package/dist/tools/sql-complexity-tools.js.map +1 -0
- package/dist/tools/sql-dml-safety-tools.d.ts +26 -0
- package/dist/tools/sql-dml-safety-tools.d.ts.map +1 -0
- package/dist/tools/sql-dml-safety-tools.js +104 -0
- package/dist/tools/sql-dml-safety-tools.js.map +1 -0
- package/dist/tools/sql-drift-tools.d.ts +39 -0
- package/dist/tools/sql-drift-tools.d.ts.map +1 -0
- package/dist/tools/sql-drift-tools.js +238 -0
- package/dist/tools/sql-drift-tools.js.map +1 -0
- package/dist/tools/sql-lint-schema-tools.d.ts +28 -0
- package/dist/tools/sql-lint-schema-tools.d.ts.map +1 -0
- package/dist/tools/sql-lint-schema-tools.js +96 -0
- package/dist/tools/sql-lint-schema-tools.js.map +1 -0
- package/dist/tools/sql-migration-diff-tools.d.ts +24 -0
- package/dist/tools/sql-migration-diff-tools.d.ts.map +1 -0
- package/dist/tools/sql-migration-diff-tools.js +120 -0
- package/dist/tools/sql-migration-diff-tools.js.map +1 -0
- package/dist/tools/sql-orphan-table-tools.d.ts +20 -0
- package/dist/tools/sql-orphan-table-tools.d.ts.map +1 -0
- package/dist/tools/sql-orphan-table-tools.js +70 -0
- package/dist/tools/sql-orphan-table-tools.js.map +1 -0
- package/dist/tools/sql-query-tools.d.ts +32 -0
- package/dist/tools/sql-query-tools.d.ts.map +1 -0
- package/dist/tools/sql-query-tools.js +130 -0
- package/dist/tools/sql-query-tools.js.map +1 -0
- package/dist/tools/sql-schema-tools.d.ts +47 -0
- package/dist/tools/sql-schema-tools.d.ts.map +1 -0
- package/dist/tools/sql-schema-tools.js +202 -0
- package/dist/tools/sql-schema-tools.js.map +1 -0
- package/dist/tools/sql-shared-tools.d.ts +6 -0
- package/dist/tools/sql-shared-tools.d.ts.map +1 -0
- package/dist/tools/sql-shared-tools.js +59 -0
- package/dist/tools/sql-shared-tools.js.map +1 -0
- package/dist/tools/sql-tools.d.ts +25 -296
- package/dist/tools/sql-tools.d.ts.map +1 -1
- package/dist/tools/sql-tools.js +15 -1232
- package/dist/tools/sql-tools.js.map +1 -1
- package/dist/tools/status-tools.js +1 -1
- package/dist/tools/status-tools.js.map +1 -1
- package/dist/tools/workspace-tools.d.ts +1 -1
- package/dist/tools/yii3-migration-categories-application.d.ts +4 -0
- package/dist/tools/yii3-migration-categories-application.d.ts.map +1 -0
- package/dist/tools/yii3-migration-categories-application.js +56 -0
- package/dist/tools/yii3-migration-categories-application.js.map +1 -0
- package/dist/tools/yii3-migration-categories-infrastructure.d.ts +4 -0
- package/dist/tools/yii3-migration-categories-infrastructure.d.ts.map +1 -0
- package/dist/tools/yii3-migration-categories-infrastructure.js +67 -0
- package/dist/tools/yii3-migration-categories-infrastructure.js.map +1 -0
- package/dist/tools/yii3-migration-categories-model-view.d.ts +4 -0
- package/dist/tools/yii3-migration-categories-model-view.d.ts.map +1 -0
- package/dist/tools/yii3-migration-categories-model-view.js +59 -0
- package/dist/tools/yii3-migration-categories-model-view.js.map +1 -0
- package/dist/tools/yii3-migration-categories-runtime.d.ts +4 -0
- package/dist/tools/yii3-migration-categories-runtime.d.ts.map +1 -0
- package/dist/tools/yii3-migration-categories-runtime.js +49 -0
- package/dist/tools/yii3-migration-categories-runtime.js.map +1 -0
- package/dist/tools/yii3-migration-categories.d.ts +5 -0
- package/dist/tools/yii3-migration-categories.d.ts.map +1 -0
- package/dist/tools/yii3-migration-categories.js +18 -0
- package/dist/tools/yii3-migration-categories.js.map +1 -0
- package/dist/tools/yii3-migration-report.d.ts +4 -0
- package/dist/tools/yii3-migration-report.d.ts.map +1 -0
- package/dist/tools/yii3-migration-report.js +88 -0
- package/dist/tools/yii3-migration-report.js.map +1 -0
- package/dist/tools/yii3-migration-scanner.d.ts +28 -0
- package/dist/tools/yii3-migration-scanner.d.ts.map +1 -0
- package/dist/tools/yii3-migration-scanner.js +87 -0
- package/dist/tools/yii3-migration-scanner.js.map +1 -0
- package/dist/tools/yii3-migration-tools.d.ts +4 -73
- package/dist/tools/yii3-migration-tools.d.ts.map +1 -1
- package/dist/tools/yii3-migration-tools.js +5 -433
- package/dist/tools/yii3-migration-tools.js.map +1 -1
- package/dist/tools/yii3-migration-types.d.ts +50 -0
- package/dist/tools/yii3-migration-types.d.ts.map +1 -0
- package/dist/tools/yii3-migration-types.js +3 -0
- package/dist/tools/yii3-migration-types.js.map +1 -0
- package/dist/utils/edge-provenance.d.ts +55 -0
- package/dist/utils/edge-provenance.d.ts.map +1 -0
- package/dist/utils/edge-provenance.js +53 -0
- package/dist/utils/edge-provenance.js.map +1 -0
- package/dist/utils/git-validation.d.ts +24 -0
- package/dist/utils/git-validation.d.ts.map +1 -1
- package/dist/utils/git-validation.js +30 -0
- package/dist/utils/git-validation.js.map +1 -1
- package/dist/utils/overlay-cache.d.ts +38 -0
- package/dist/utils/overlay-cache.d.ts.map +1 -0
- package/dist/utils/overlay-cache.js +73 -0
- package/dist/utils/overlay-cache.js.map +1 -0
- package/dist/utils/source-stripper/code-handler.d.ts +3 -0
- package/dist/utils/source-stripper/code-handler.d.ts.map +1 -0
- package/dist/utils/source-stripper/code-handler.js +79 -0
- package/dist/utils/source-stripper/code-handler.js.map +1 -0
- package/dist/utils/source-stripper/comment-handler.d.ts +4 -0
- package/dist/utils/source-stripper/comment-handler.d.ts.map +1 -0
- package/dist/utils/source-stripper/comment-handler.js +24 -0
- package/dist/utils/source-stripper/comment-handler.js.map +1 -0
- package/dist/utils/source-stripper/machine.d.ts +2 -0
- package/dist/utils/source-stripper/machine.d.ts.map +1 -0
- package/dist/utils/source-stripper/machine.js +34 -0
- package/dist/utils/source-stripper/machine.js.map +1 -0
- package/dist/utils/source-stripper/regex-handler.d.ts +3 -0
- package/dist/utils/source-stripper/regex-handler.d.ts.map +1 -0
- package/dist/utils/source-stripper/regex-handler.js +44 -0
- package/dist/utils/source-stripper/regex-handler.js.map +1 -0
- package/dist/utils/source-stripper/state.d.ts +4 -0
- package/dist/utils/source-stripper/state.d.ts.map +1 -0
- package/dist/utils/source-stripper/state.js +20 -0
- package/dist/utils/source-stripper/state.js.map +1 -0
- package/dist/utils/source-stripper/string-handler.d.ts +3 -0
- package/dist/utils/source-stripper/string-handler.d.ts.map +1 -0
- package/dist/utils/source-stripper/string-handler.js +19 -0
- package/dist/utils/source-stripper/string-handler.js.map +1 -0
- package/dist/utils/source-stripper/template-handler.d.ts +4 -0
- package/dist/utils/source-stripper/template-handler.d.ts.map +1 -0
- package/dist/utils/source-stripper/template-handler.js +40 -0
- package/dist/utils/source-stripper/template-handler.js.map +1 -0
- package/dist/utils/source-stripper/types.d.ts +17 -0
- package/dist/utils/source-stripper/types.d.ts.map +1 -0
- package/dist/utils/source-stripper/types.js +4 -0
- package/dist/utils/source-stripper/types.js.map +1 -0
- package/dist/utils/source-stripper.d.ts +0 -21
- package/dist/utils/source-stripper.d.ts.map +1 -1
- package/dist/utils/source-stripper.js +6 -234
- package/dist/utils/source-stripper.js.map +1 -1
- package/dist/utils/walk/errors.d.ts +4 -0
- package/dist/utils/walk/errors.d.ts.map +1 -0
- package/dist/utils/walk/errors.js +18 -0
- package/dist/utils/walk/errors.js.map +1 -0
- package/dist/utils/walk/filters.d.ts +11 -0
- package/dist/utils/walk/filters.d.ts.map +1 -0
- package/dist/utils/walk/filters.js +53 -0
- package/dist/utils/walk/filters.js.map +1 -0
- package/dist/utils/walk/limits.d.ts +10 -0
- package/dist/utils/walk/limits.d.ts.map +1 -0
- package/dist/utils/walk/limits.js +22 -0
- package/dist/utils/walk/limits.js.map +1 -0
- package/dist/utils/walk/traversal.d.ts +9 -0
- package/dist/utils/walk/traversal.d.ts.map +1 -0
- package/dist/utils/walk/traversal.js +38 -0
- package/dist/utils/walk/traversal.js.map +1 -0
- package/dist/utils/walk/types.d.ts +18 -0
- package/dist/utils/walk/types.d.ts.map +1 -0
- package/dist/utils/walk/types.js +2 -0
- package/dist/utils/walk/types.js.map +1 -0
- package/dist/utils/walk.d.ts +4 -65
- package/dist/utils/walk.d.ts.map +1 -1
- package/dist/utils/walk.js +23 -151
- package/dist/utils/walk.js.map +1 -1
- package/package.json +6 -5
|
@@ -1,1267 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* React-specific code intelligence tools.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
export {
|
|
13
|
-
|
|
14
|
-
// formatRendersMarkdown and buildContextGraph are exported inline at definition site below
|
|
15
|
-
// ── Limits (mirror graph-tools.ts) ──────────────────────────
|
|
16
|
-
const MAX_TREE_NODES = 500;
|
|
17
|
-
const MAX_CHILDREN_PER_NODE = 20;
|
|
18
|
-
const DEFAULT_DEPTH = 3;
|
|
19
|
-
// ── React stdlib hooks (used as denylist in tracing and inventory) ──
|
|
20
|
-
export const REACT_STDLIB_HOOKS = new Set([
|
|
21
|
-
"useState", "useEffect", "useCallback", "useMemo", "useRef",
|
|
22
|
-
"useContext", "useReducer", "useLayoutEffect", "useImperativeHandle",
|
|
23
|
-
"useDebugValue", "useDeferredValue", "useTransition", "useId",
|
|
24
|
-
"useSyncExternalStore", "useInsertionEffect", "useOptimistic",
|
|
25
|
-
"useFormState", "useFormStatus", "use",
|
|
26
|
-
]);
|
|
27
|
-
/**
|
|
28
|
-
* Extract PascalCase JSX element names from source code.
|
|
29
|
-
* Returns the set of component names used via `<ComponentName ...>` or `<ComponentName/>`.
|
|
30
|
-
* HTML elements (lowercase) are skipped.
|
|
31
|
-
*/
|
|
32
|
-
function extractJsxComponents(source) {
|
|
33
|
-
const names = new Set();
|
|
34
|
-
const pattern = /<([A-Z][a-zA-Z0-9_$]*)\b/g;
|
|
35
|
-
let m;
|
|
36
|
-
while ((m = pattern.exec(source)) !== null) {
|
|
37
|
-
names.add(m[1]);
|
|
38
|
-
}
|
|
39
|
-
return names;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Build component → rendered-components adjacency from the index.
|
|
43
|
-
* Only considers symbols with kind "component" (requires Wave 1 extractor).
|
|
44
|
-
*/
|
|
45
|
-
function buildJsxAdjacency(symbols) {
|
|
46
|
-
const children = new Map();
|
|
47
|
-
// name → component symbols lookup (may have multiple definitions with same name)
|
|
48
|
-
const nameToComponents = new Map();
|
|
49
|
-
// file → component symbols lookup (used by alias-resolved imports)
|
|
50
|
-
const fileToComponents = new Map();
|
|
51
|
-
for (const sym of symbols) {
|
|
52
|
-
if (sym.kind !== "component")
|
|
53
|
-
continue;
|
|
54
|
-
const existing = nameToComponents.get(sym.name);
|
|
55
|
-
if (existing)
|
|
56
|
-
existing.push(sym);
|
|
57
|
-
else
|
|
58
|
-
nameToComponents.set(sym.name, [sym]);
|
|
59
|
-
const fileExisting = fileToComponents.get(sym.file);
|
|
60
|
-
if (fileExisting)
|
|
61
|
-
fileExisting.push(sym);
|
|
62
|
-
else
|
|
63
|
-
fileToComponents.set(sym.file, [sym]);
|
|
64
|
-
}
|
|
65
|
-
// Build a synthetic files list for resolveAlias() — needs only `path` field.
|
|
66
|
-
const filesList = [...fileToComponents.keys()].map((path) => ({ path }));
|
|
67
|
-
for (const sym of symbols) {
|
|
68
|
-
if (sym.kind !== "component" || !sym.source)
|
|
69
|
-
continue;
|
|
70
|
-
const rendered = extractJsxComponents(sym.source);
|
|
71
|
-
const childList = [];
|
|
72
|
-
// Parse alias imports in this component's source for fallback resolution
|
|
73
|
-
// (Tier 4 — Item 8 wired into trace_component_tree).
|
|
74
|
-
// Pattern: import { X, Y as Z } from "@/components/Button"
|
|
75
|
-
// Pattern: import Default from "@/components/Foo"
|
|
76
|
-
const aliasImports = new Map(); // localName → resolved file
|
|
77
|
-
const importRe = /import\s+(?:(\w+)|(?:\{([^}]+)\}))(?:\s*,\s*(?:(\w+)|(?:\{([^}]+)\})))?\s+from\s+["'](@\/[^"']+)["']/g;
|
|
78
|
-
let im;
|
|
79
|
-
while ((im = importRe.exec(sym.source)) !== null) {
|
|
80
|
-
const aliasPath = im[5];
|
|
81
|
-
const resolved = resolveAlias(aliasPath, filesList);
|
|
82
|
-
if (!resolved)
|
|
83
|
-
continue;
|
|
84
|
-
// default import
|
|
85
|
-
if (im[1])
|
|
86
|
-
aliasImports.set(im[1], resolved);
|
|
87
|
-
if (im[3])
|
|
88
|
-
aliasImports.set(im[3], resolved);
|
|
89
|
-
// named imports {A, B as C}
|
|
90
|
-
const namedGroup = im[2] ?? im[4];
|
|
91
|
-
if (namedGroup) {
|
|
92
|
-
for (const part of namedGroup.split(",")) {
|
|
93
|
-
const trimmed = part.trim();
|
|
94
|
-
// Handle "X as Y" → local name is Y
|
|
95
|
-
const asMatch = trimmed.match(/^(\w+)\s+as\s+(\w+)$/);
|
|
96
|
-
const localName = asMatch ? asMatch[2] : trimmed.replace(/\s.*$/, "");
|
|
97
|
-
if (localName)
|
|
98
|
-
aliasImports.set(localName, resolved);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
for (const name of rendered) {
|
|
103
|
-
if (name === sym.name)
|
|
104
|
-
continue; // skip self-reference
|
|
105
|
-
const targets = nameToComponents.get(name);
|
|
106
|
-
if (targets) {
|
|
107
|
-
for (const target of targets) {
|
|
108
|
-
if (target.id !== sym.id)
|
|
109
|
-
childList.push(target);
|
|
110
|
-
}
|
|
111
|
-
continue;
|
|
112
|
-
}
|
|
113
|
-
// Fallback: alias-resolved import lookup
|
|
114
|
-
const aliasTargetFile = aliasImports.get(name);
|
|
115
|
-
if (aliasTargetFile) {
|
|
116
|
-
const fileTargets = fileToComponents.get(aliasTargetFile) ?? [];
|
|
117
|
-
for (const target of fileTargets) {
|
|
118
|
-
if (target.id !== sym.id)
|
|
119
|
-
childList.push(target);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
if (childList.length > 0)
|
|
124
|
-
children.set(sym.id, childList);
|
|
125
|
-
}
|
|
126
|
-
return { children };
|
|
127
|
-
}
|
|
128
|
-
// ─────────────────────────────────────────────────────────────
|
|
129
|
-
// Tier 5 — prop_chain_depth metric helpers
|
|
130
|
-
// ─────────────────────────────────────────────────────────────
|
|
131
|
-
/**
|
|
132
|
-
* Invert JsxAdjacency to a reverse adjacency: child id → sorted list of parent ids.
|
|
133
|
-
*
|
|
134
|
-
* Used by computePropChainDepth to walk UP the render tree (from a leaf back toward
|
|
135
|
-
* roots) and measure render-tree depth. Sorts each parent list alphabetically for
|
|
136
|
-
* deterministic output on cyclic graphs.
|
|
137
|
-
*/
|
|
138
|
-
function buildReverseAdjacency(adjacency) {
|
|
139
|
-
const parents = new Map();
|
|
140
|
-
for (const [parentId, children] of adjacency.children) {
|
|
141
|
-
for (const child of children) {
|
|
142
|
-
const list = parents.get(child.id) ?? [];
|
|
143
|
-
list.push(parentId);
|
|
144
|
-
parents.set(child.id, list);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
// Sort each parent list alphabetically for determinism on cyclic graphs
|
|
148
|
-
for (const [k, v] of parents)
|
|
149
|
-
parents.set(k, [...v].sort());
|
|
150
|
-
return parents;
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Compute the longest path (in edges) from componentId UP to the deepest root in
|
|
154
|
-
* the reverse JSX adjacency. This is render-tree depth — NOT prop-flow depth.
|
|
155
|
-
*
|
|
156
|
-
* Iterative implementation using an explicit 2-phase ("enter"/"exit") stack to
|
|
157
|
-
* avoid recursive blowup on deep linear chains (V8 stack ~10-15K frames).
|
|
158
|
-
*
|
|
159
|
-
* Uses shared `memo` and `inProgress` across all calls in one analyzeRenders run
|
|
160
|
-
* to amortize cost to O(V+E) total.
|
|
161
|
-
*/
|
|
162
|
-
function computePropChainDepth(componentId, reverseAdjacency, memo, inProgress) {
|
|
163
|
-
if (memo.has(componentId))
|
|
164
|
-
return memo.get(componentId);
|
|
165
|
-
if (inProgress.has(componentId))
|
|
166
|
-
return 0;
|
|
167
|
-
const stack = [{ node: componentId, phase: "enter" }];
|
|
168
|
-
while (stack.length > 0) {
|
|
169
|
-
const f = stack[stack.length - 1];
|
|
170
|
-
if (f.phase === "enter") {
|
|
171
|
-
if (memo.has(f.node)) {
|
|
172
|
-
stack.pop();
|
|
173
|
-
continue;
|
|
174
|
-
}
|
|
175
|
-
if (inProgress.has(f.node)) {
|
|
176
|
-
stack.pop();
|
|
177
|
-
continue;
|
|
178
|
-
}
|
|
179
|
-
inProgress.add(f.node);
|
|
180
|
-
f.phase = "exit";
|
|
181
|
-
for (const p of reverseAdjacency.get(f.node) ?? []) {
|
|
182
|
-
if (!memo.has(p) && !inProgress.has(p)) {
|
|
183
|
-
stack.push({ node: p, phase: "enter" });
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
else {
|
|
188
|
-
// exit phase — exclude back-edges (parents still in inProgress closing a
|
|
189
|
-
// cycle) so a strongly-connected component with no real root reports
|
|
190
|
-
// depth 0 instead of inflating linearly with cycle-traversal order.
|
|
191
|
-
const parents = reverseAdjacency.get(f.node) ?? [];
|
|
192
|
-
let maxParentDepth = -1;
|
|
193
|
-
let nonCyclicParents = 0;
|
|
194
|
-
for (const p of parents) {
|
|
195
|
-
if (inProgress.has(p))
|
|
196
|
-
continue; // back-edge — exclude from depth
|
|
197
|
-
nonCyclicParents++;
|
|
198
|
-
const d = memo.get(p) ?? 0;
|
|
199
|
-
if (d > maxParentDepth)
|
|
200
|
-
maxParentDepth = d;
|
|
201
|
-
}
|
|
202
|
-
const depth = nonCyclicParents === 0 ? 0 : maxParentDepth + 1;
|
|
203
|
-
memo.set(f.node, depth);
|
|
204
|
-
inProgress.delete(f.node);
|
|
205
|
-
stack.pop();
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
return memo.get(componentId);
|
|
209
|
-
}
|
|
210
|
-
// ─────────────────────────────────────────────────────────────
|
|
211
|
-
// Tier 7 — Cross-file Suspense ancestor detection
|
|
212
|
-
// ─────────────────────────────────────────────────────────────
|
|
213
|
-
/**
|
|
214
|
-
* Strip line comments, block comments, and string literals from source before
|
|
215
|
-
* scanning for JSX tokens. Tier 7 R-1 fix — prevents `<Suspense>` mentions in
|
|
216
|
-
* comments/JSDoc/string literals from spoofing the ancestor check.
|
|
217
|
-
*
|
|
218
|
-
* Strategy: replace each construct with whitespace of equal length so line/col
|
|
219
|
-
* positions remain stable for any downstream regex. Order matters:
|
|
220
|
-
* 1. Block comments first (greedy until `* /`)
|
|
221
|
-
* 2. Line comments (until newline)
|
|
222
|
-
* 3. Template literals (handle ${} expressions opaquely — strip whole literal)
|
|
223
|
-
* 4. Single-quoted strings
|
|
224
|
-
* 5. Double-quoted strings
|
|
225
|
-
*
|
|
226
|
-
* This is a heuristic stripper, not a full lexer; it suffices for boundary
|
|
227
|
-
* detection on idiomatic source. Pathological inputs (comment-like text inside
|
|
228
|
-
* unclosed strings) are not the target.
|
|
229
|
-
*/
|
|
230
|
-
function stripCommentsAndStrings(source) {
|
|
231
|
-
// Single-pass state machine — adversarial review flagged regex layering as
|
|
232
|
-
// unreliable when `//` appears inside string literals (would be consumed as
|
|
233
|
-
// a comment first). State machine processes character-by-character so a
|
|
234
|
-
// `//` inside `"..."` correctly stays inside the string.
|
|
235
|
-
const out = [];
|
|
236
|
-
let i = 0;
|
|
237
|
-
const n = source.length;
|
|
238
|
-
let state = "code";
|
|
239
|
-
// Track previous non-whitespace char to detect when `/` starts a regex literal.
|
|
240
|
-
// After expression-terminating tokens (`)`, `]`, identifier, number, string),
|
|
241
|
-
// `/` means division. After expression-starting context (`=`, `(`, `,`, `;`,
|
|
242
|
-
// `!`, `&`, `|`, `?`, `:`, `{`, `return`, etc.), `/` starts a regex.
|
|
243
|
-
// Heuristic: track last non-space code-state char.
|
|
244
|
-
let lastCodeChar = "";
|
|
245
|
-
function isRegexContext(prev) {
|
|
246
|
-
// Conservative: `/` is a regex when preceded by an operator/separator.
|
|
247
|
-
if (prev === "")
|
|
248
|
-
return true;
|
|
249
|
-
return /[=(,;!&|?:{[<>+\-*%^~]/.test(prev);
|
|
250
|
-
}
|
|
251
|
-
while (i < n) {
|
|
252
|
-
const c = source[i];
|
|
253
|
-
const next = i + 1 < n ? source[i + 1] : "";
|
|
254
|
-
if (state === "code") {
|
|
255
|
-
if (c === "/" && next === "/") {
|
|
256
|
-
state = "lineComment";
|
|
257
|
-
out.push(" ", " ");
|
|
258
|
-
i += 2;
|
|
259
|
-
continue;
|
|
260
|
-
}
|
|
261
|
-
if (c === "/" && next === "*") {
|
|
262
|
-
state = "blockComment";
|
|
263
|
-
out.push(" ", " ");
|
|
264
|
-
i += 2;
|
|
265
|
-
continue;
|
|
266
|
-
}
|
|
267
|
-
if (c === "/" && isRegexContext(lastCodeChar)) {
|
|
268
|
-
state = "regex";
|
|
269
|
-
out.push(" ");
|
|
270
|
-
i++;
|
|
271
|
-
continue;
|
|
272
|
-
}
|
|
273
|
-
if (c === "'") {
|
|
274
|
-
state = "single";
|
|
275
|
-
out.push(" ");
|
|
276
|
-
i++;
|
|
277
|
-
lastCodeChar = c;
|
|
278
|
-
continue;
|
|
279
|
-
}
|
|
280
|
-
if (c === '"') {
|
|
281
|
-
state = "double";
|
|
282
|
-
out.push(" ");
|
|
283
|
-
i++;
|
|
284
|
-
lastCodeChar = c;
|
|
285
|
-
continue;
|
|
286
|
-
}
|
|
287
|
-
if (c === "`") {
|
|
288
|
-
state = "template";
|
|
289
|
-
out.push(" ");
|
|
290
|
-
i++;
|
|
291
|
-
lastCodeChar = c;
|
|
292
|
-
continue;
|
|
293
|
-
}
|
|
294
|
-
out.push(c);
|
|
295
|
-
if (!/\s/.test(c))
|
|
296
|
-
lastCodeChar = c;
|
|
297
|
-
i++;
|
|
298
|
-
continue;
|
|
299
|
-
}
|
|
300
|
-
if (state === "lineComment") {
|
|
301
|
-
if (c === "\n") {
|
|
302
|
-
state = "code";
|
|
303
|
-
out.push("\n");
|
|
304
|
-
i++;
|
|
305
|
-
continue;
|
|
306
|
-
}
|
|
307
|
-
out.push(" ");
|
|
308
|
-
i++;
|
|
309
|
-
continue;
|
|
310
|
-
}
|
|
311
|
-
if (state === "blockComment") {
|
|
312
|
-
if (c === "*" && next === "/") {
|
|
313
|
-
state = "code";
|
|
314
|
-
out.push(" ", " ");
|
|
315
|
-
i += 2;
|
|
316
|
-
continue;
|
|
317
|
-
}
|
|
318
|
-
out.push(c === "\n" ? "\n" : " ");
|
|
319
|
-
i++;
|
|
320
|
-
continue;
|
|
321
|
-
}
|
|
322
|
-
if (state === "regex") {
|
|
323
|
-
// Inside /pattern/flags. Closer is unescaped `/`. Char classes [...] disable / closing.
|
|
324
|
-
if (c === "\\" && next) {
|
|
325
|
-
out.push(" ", " ");
|
|
326
|
-
i += 2;
|
|
327
|
-
continue;
|
|
328
|
-
}
|
|
329
|
-
if (c === "[") {
|
|
330
|
-
// skip char class
|
|
331
|
-
out.push(" ");
|
|
332
|
-
i++;
|
|
333
|
-
while (i < n && source[i] !== "]") {
|
|
334
|
-
if (source[i] === "\\" && i + 1 < n) {
|
|
335
|
-
out.push(" ", " ");
|
|
336
|
-
i += 2;
|
|
337
|
-
continue;
|
|
338
|
-
}
|
|
339
|
-
out.push(source[i] === "\n" ? "\n" : " ");
|
|
340
|
-
i++;
|
|
341
|
-
}
|
|
342
|
-
if (i < n) {
|
|
343
|
-
out.push(" ");
|
|
344
|
-
i++;
|
|
345
|
-
}
|
|
346
|
-
continue;
|
|
347
|
-
}
|
|
348
|
-
if (c === "/") {
|
|
349
|
-
state = "code";
|
|
350
|
-
out.push(" ");
|
|
351
|
-
i++;
|
|
352
|
-
lastCodeChar = "/";
|
|
353
|
-
continue;
|
|
354
|
-
}
|
|
355
|
-
out.push(c === "\n" ? "\n" : " ");
|
|
356
|
-
i++;
|
|
357
|
-
continue;
|
|
358
|
-
}
|
|
359
|
-
if (state === "single" || state === "double" || state === "template") {
|
|
360
|
-
const closer = state === "single" ? "'" : state === "double" ? '"' : "`";
|
|
361
|
-
if (c === "\\" && next) {
|
|
362
|
-
out.push(" ", " ");
|
|
363
|
-
i += 2;
|
|
364
|
-
continue; // skip escaped char
|
|
365
|
-
}
|
|
366
|
-
if (c === closer) {
|
|
367
|
-
state = "code";
|
|
368
|
-
out.push(" ");
|
|
369
|
-
i++;
|
|
370
|
-
continue;
|
|
371
|
-
}
|
|
372
|
-
out.push(c === "\n" ? "\n" : " ");
|
|
373
|
-
i++;
|
|
374
|
-
continue;
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
return out.join("");
|
|
378
|
-
}
|
|
379
|
-
/**
|
|
380
|
-
* Check whether source contains `<Suspense>` or `<React.Suspense>` JSX.
|
|
381
|
-
* Tier 7 R-1 fix: strips comments + string literals first, so JSDoc snippets
|
|
382
|
-
* and string-embedded `<Suspense>` text no longer spoof the check.
|
|
383
|
-
*/
|
|
384
|
-
function hasSuspenseInSource(source) {
|
|
385
|
-
return /<(?:React\.)?Suspense\b/.test(stripCommentsAndStrings(source));
|
|
386
|
-
}
|
|
387
|
-
/**
|
|
388
|
-
* Walk UP the JSX render tree from a component, looking for any ancestor whose
|
|
389
|
-
* source contains a Suspense boundary. Returns the first ancestor found, or
|
|
390
|
-
* null if no Suspense exists anywhere in the upward chain.
|
|
391
|
-
*
|
|
392
|
-
* Tier 7 — closes the cross-file FP in `react-lazy-no-suspense-same-file` regex
|
|
393
|
-
* (Tier 6 limitation). Reuses `buildReverseAdjacency` infrastructure from Tier 5.
|
|
394
|
-
* Cycle-safe via visited set (BFS on potentially cyclic graph).
|
|
395
|
-
*/
|
|
396
|
-
export function findSuspenseAncestor(componentId, reverseAdjacency, symbolsById) {
|
|
397
|
-
// Tier 7 fix (gemini Run finding): visited.add() at push-time (not pop-time)
|
|
398
|
-
// prevents O(E) duplicate queue pushes on densely-connected component graphs.
|
|
399
|
-
const visited = new Set([componentId]);
|
|
400
|
-
const queue = [];
|
|
401
|
-
for (const p of reverseAdjacency.get(componentId) ?? []) {
|
|
402
|
-
if (!visited.has(p)) {
|
|
403
|
-
visited.add(p);
|
|
404
|
-
queue.push(p);
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
let head = 0;
|
|
408
|
-
while (head < queue.length) {
|
|
409
|
-
const parentId = queue[head++];
|
|
410
|
-
const sym = symbolsById.get(parentId);
|
|
411
|
-
if (sym?.source && hasSuspenseInSource(sym.source)) {
|
|
412
|
-
return { name: sym.name, file: sym.file };
|
|
413
|
-
}
|
|
414
|
-
for (const gp of reverseAdjacency.get(parentId) ?? []) {
|
|
415
|
-
if (!visited.has(gp)) {
|
|
416
|
-
visited.add(gp);
|
|
417
|
-
queue.push(gp);
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
return null;
|
|
422
|
-
}
|
|
423
|
-
export function findLazyComponentsWithoutSuspense(symbols) {
|
|
424
|
-
const components = symbols.filter((s) => s.kind === "component");
|
|
425
|
-
const adjacency = buildJsxAdjacency(components);
|
|
426
|
-
const reverseAdj = buildReverseAdjacency(adjacency);
|
|
427
|
-
const symbolsById = new Map();
|
|
428
|
-
for (const s of components)
|
|
429
|
-
symbolsById.set(s.id, s);
|
|
430
|
-
// Tier 7 fix (cursor-agent finding): word-boundary before `lazy` to avoid matching
|
|
431
|
-
// arbitrary `.lazy(` callable chains (e.g., `obj.lazy(`). Match either `React.lazy(`
|
|
432
|
-
// OR bare `lazy(` (named-import form), with `\b` to anchor identifier start.
|
|
433
|
-
const lazyRe = /\b(?:React\.lazy|lazy)\s*\(/;
|
|
434
|
-
// Tier 7 R-4 fix: scan ALL symbols (not just kind="component") for lazy() usage.
|
|
435
|
-
// Module-scope assignments like `const X = lazy(() => import('./X'))` often live
|
|
436
|
-
// outside any component body. For non-component symbols, attribute the issue to
|
|
437
|
-
// the file's nearest component (or to the symbol itself if no component shares
|
|
438
|
-
// the file). Same-file Suspense check still applies — looks at the OWNING
|
|
439
|
-
// component's source for ancestor walking.
|
|
440
|
-
const lazyDeclByFile = new Map();
|
|
441
|
-
for (const sym of symbols) {
|
|
442
|
-
if (!sym.source || !lazyRe.test(stripCommentsAndStrings(sym.source)))
|
|
443
|
-
continue;
|
|
444
|
-
// Skip if this symbol's source already declares Suspense (same-file safety).
|
|
445
|
-
if (hasSuspenseInSource(sym.source))
|
|
446
|
-
continue;
|
|
447
|
-
// Adversarial Run 4 finding: arbitrary `components.find(c.file === sym.file)`
|
|
448
|
-
// could attach to wrong component. Fix: require ALL same-file components to
|
|
449
|
-
// satisfy Suspense rule. Conservative — false-NEGATIVE bias (one wrapped sibling
|
|
450
|
-
// in a multi-component file suppresses warning even if another consumer is unsafe).
|
|
451
|
-
// KNOWN LIMIT (Tier 8): true fix requires graph traversal — find which component
|
|
452
|
-
// actually RENDERS the lazy binding (via JSX `<Heavy/>` reference search), not
|
|
453
|
-
// just file co-location. Tier 8 brainstorm scope.
|
|
454
|
-
const sameFileComponents = components.filter((c) => c.file === sym.file);
|
|
455
|
-
if (sameFileComponents.length === 0) {
|
|
456
|
-
// No component context available — flag the lazy declaration directly.
|
|
457
|
-
const key = sym.file;
|
|
458
|
-
if (!lazyDeclByFile.has(key)) {
|
|
459
|
-
lazyDeclByFile.set(key, { name: sym.name, file: sym.file, start_line: sym.start_line });
|
|
460
|
-
}
|
|
461
|
-
continue;
|
|
462
|
-
}
|
|
463
|
-
const anySafe = sameFileComponents.some((c) => {
|
|
464
|
-
if (hasSuspenseInSource(c.source ?? ""))
|
|
465
|
-
return true;
|
|
466
|
-
return findSuspenseAncestor(c.id, reverseAdj, symbolsById) !== null;
|
|
467
|
-
});
|
|
468
|
-
if (!anySafe) {
|
|
469
|
-
const key = sym.file;
|
|
470
|
-
if (!lazyDeclByFile.has(key)) {
|
|
471
|
-
lazyDeclByFile.set(key, { name: sym.name, file: sym.file, start_line: sym.start_line });
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
return [...lazyDeclByFile.values()];
|
|
476
|
-
}
|
|
477
|
-
/**
|
|
478
|
-
* BFS the component composition tree from a root component.
|
|
479
|
-
* Returns a CallNode tree of rendered components up to maxDepth.
|
|
480
|
-
*/
|
|
481
|
-
function buildComponentTree(root, adjacency, maxDepth) {
|
|
482
|
-
const visited = new Set([root.id]);
|
|
483
|
-
let totalNodes = 1;
|
|
484
|
-
function expand(symbol, depth) {
|
|
485
|
-
if (depth >= maxDepth || totalNodes >= MAX_TREE_NODES) {
|
|
486
|
-
return { symbol, children: [] };
|
|
487
|
-
}
|
|
488
|
-
const kids = adjacency.children.get(symbol.id) ?? [];
|
|
489
|
-
const out = [];
|
|
490
|
-
for (const kid of kids) {
|
|
491
|
-
if (totalNodes >= MAX_TREE_NODES)
|
|
492
|
-
break;
|
|
493
|
-
if (out.length >= MAX_CHILDREN_PER_NODE)
|
|
494
|
-
break;
|
|
495
|
-
if (visited.has(kid.id))
|
|
496
|
-
continue;
|
|
497
|
-
visited.add(kid.id);
|
|
498
|
-
totalNodes++;
|
|
499
|
-
out.push(expand(kid, depth + 1));
|
|
500
|
-
}
|
|
501
|
-
return { symbol, children: out };
|
|
502
|
-
}
|
|
503
|
-
return expand(root, 0);
|
|
504
|
-
}
|
|
505
|
-
function stripSource(sym) {
|
|
506
|
-
const { source: _, repo: _r, tokens: _t, start_col: _sc, end_col: _ec, id, ...rest } = sym;
|
|
507
|
-
const shortId = id.includes(":") ? id.slice(id.indexOf(":") + 1) : id;
|
|
508
|
-
return { ...rest, id: shortId };
|
|
509
|
-
}
|
|
510
|
-
function stripTreeSource(node) {
|
|
511
|
-
return {
|
|
512
|
-
symbol: stripSource(node.symbol),
|
|
513
|
-
children: node.children.map(stripTreeSource),
|
|
514
|
-
};
|
|
515
|
-
}
|
|
516
|
-
function treeToMermaid(tree, rootName) {
|
|
517
|
-
const lines = ["graph TD"];
|
|
518
|
-
const visited = new Set();
|
|
519
|
-
function nodeId(sym) {
|
|
520
|
-
return sym.id.replace(/[^a-zA-Z0-9_]/g, "_");
|
|
521
|
-
}
|
|
522
|
-
function nodeLabel(sym) {
|
|
523
|
-
const shortFile = sym.file.split("/").pop() ?? sym.file;
|
|
524
|
-
return `${sym.name}<br/><small>${shortFile}:${sym.start_line}</small>`;
|
|
525
|
-
}
|
|
526
|
-
function walk(node, parentId) {
|
|
527
|
-
const id = nodeId(node.symbol);
|
|
528
|
-
if (!visited.has(id)) {
|
|
529
|
-
visited.add(id);
|
|
530
|
-
lines.push(` ${id}["${nodeLabel(node.symbol)}"]`);
|
|
531
|
-
}
|
|
532
|
-
if (parentId) {
|
|
533
|
-
lines.push(` ${parentId} --> ${id}`);
|
|
534
|
-
}
|
|
535
|
-
for (const child of node.children) {
|
|
536
|
-
walk(child, id);
|
|
537
|
-
}
|
|
538
|
-
}
|
|
539
|
-
walk(tree);
|
|
540
|
-
lines.push(` %% root: ${rootName}`);
|
|
541
|
-
return lines.join("\n");
|
|
542
|
-
}
|
|
543
|
-
/**
|
|
544
|
-
* Trace the React component composition tree from a root component.
|
|
545
|
-
* Returns a tree of JSX children (which components the root renders,
|
|
546
|
-
* and recursively their children).
|
|
547
|
-
*/
|
|
548
|
-
export async function traceComponentTree(repo, rootComponent, options) {
|
|
549
|
-
const index = await getCodeIndex(repo);
|
|
550
|
-
if (!index) {
|
|
551
|
-
throw new Error(`Repository not found: ${repo}`);
|
|
552
|
-
}
|
|
553
|
-
const maxDepth = options?.depth ?? DEFAULT_DEPTH;
|
|
554
|
-
const outputFormat = options?.output_format ?? "json";
|
|
555
|
-
const includeSource = options?.include_source ?? false;
|
|
556
|
-
const includeTests = options?.include_tests ?? false;
|
|
557
|
-
const symbols = includeTests
|
|
558
|
-
? index.symbols
|
|
559
|
-
: index.symbols.filter((s) => !isTestFile(s.file));
|
|
560
|
-
// Find root component
|
|
561
|
-
const candidates = symbols.filter((s) => s.name === rootComponent && s.kind === "component");
|
|
562
|
-
const target = candidates[0];
|
|
563
|
-
if (!target) {
|
|
564
|
-
throw new Error(`Component "${rootComponent}" not found in repository "${repo}". ` +
|
|
565
|
-
`Make sure it has kind: "component" — index may need refresh.`);
|
|
566
|
-
}
|
|
567
|
-
const adjacency = buildJsxAdjacency(symbols);
|
|
568
|
-
const tree = buildComponentTree(target, adjacency, maxDepth);
|
|
569
|
-
if (outputFormat === "mermaid") {
|
|
570
|
-
return { mermaid: treeToMermaid(tree, rootComponent), root: rootComponent, depth: maxDepth };
|
|
571
|
-
}
|
|
572
|
-
return includeSource ? tree : stripTreeSource(tree);
|
|
573
|
-
}
|
|
574
|
-
/**
|
|
575
|
-
* Scan a component/hook source for Rule of Hooks violations.
|
|
576
|
-
* Detects: hook inside if/for/while/switch, hook after early return.
|
|
577
|
-
* Returns a list of human-readable violation descriptions.
|
|
578
|
-
*/
|
|
579
|
-
function findRuleOfHooksViolations(source) {
|
|
580
|
-
const violations = [];
|
|
581
|
-
// Heuristic: hook call inside if/for/while/switch block
|
|
582
|
-
const conditionalHook = /\b(if|for|while|switch)\s*\([^)]*\)\s*\{[^}]*\b(use[A-Z]\w*)\s*\(/;
|
|
583
|
-
const condMatch = conditionalHook.exec(source);
|
|
584
|
-
if (condMatch) {
|
|
585
|
-
violations.push(`Hook "${condMatch[2]}" called inside ${condMatch[1]} block — violates Rule of Hooks`);
|
|
586
|
-
}
|
|
587
|
-
// Heuristic: hook after early return
|
|
588
|
-
const earlyReturnHook = /\breturn\s+[^;{]*;\s*\n[\s\S]*?\b(use[A-Z]\w*)\s*\(/;
|
|
589
|
-
const earlyMatch = earlyReturnHook.exec(source);
|
|
590
|
-
if (earlyMatch) {
|
|
591
|
-
violations.push(`Hook "${earlyMatch[1]}" called after early return — violates Rule of Hooks`);
|
|
592
|
-
}
|
|
593
|
-
return violations;
|
|
594
|
-
}
|
|
595
|
-
/**
|
|
596
|
-
* Extract unique hook names from source (no line numbers, no cap).
|
|
597
|
-
* Use when you only need the set of hooks — e.g. React context bundle.
|
|
598
|
-
*/
|
|
599
|
-
function extractHookNames(source) {
|
|
600
|
-
const names = new Set();
|
|
601
|
-
const pattern = /\b(use[A-Z]\w*)\s*\(/g;
|
|
602
|
-
let m;
|
|
603
|
-
while ((m = pattern.exec(source)) !== null) {
|
|
604
|
-
names.add(m[1]);
|
|
605
|
-
}
|
|
606
|
-
return names;
|
|
607
|
-
}
|
|
608
|
-
/**
|
|
609
|
-
* Extract hook calls from source with their relative line number.
|
|
610
|
-
*/
|
|
611
|
-
function extractHookCalls(source) {
|
|
612
|
-
const calls = [];
|
|
613
|
-
const lines = source.split("\n");
|
|
614
|
-
const pattern = /\b(use[A-Z]\w*)\s*\(/;
|
|
615
|
-
for (let i = 0; i < lines.length && calls.length < 20; i++) {
|
|
616
|
-
const line = lines[i];
|
|
617
|
-
const m = pattern.exec(line);
|
|
618
|
-
if (m) {
|
|
619
|
-
calls.push({
|
|
620
|
-
name: m[1],
|
|
621
|
-
line: i + 1,
|
|
622
|
-
is_stdlib: REACT_STDLIB_HOOKS.has(m[1]),
|
|
623
|
-
context: line.trim().slice(0, 160),
|
|
624
|
-
});
|
|
625
|
-
}
|
|
626
|
-
}
|
|
627
|
-
return calls;
|
|
628
|
-
}
|
|
629
|
-
/**
|
|
630
|
-
* Analyze hook usage across components and custom hooks in a repo.
|
|
631
|
-
*
|
|
632
|
-
* Returns:
|
|
633
|
-
* - per-symbol inventory (hooks called, violations)
|
|
634
|
-
* - codebase-wide hook usage summary
|
|
635
|
-
* - Rule of Hooks violation count
|
|
636
|
-
*/
|
|
637
|
-
export async function analyzeHooks(repo, options) {
|
|
638
|
-
const index = await getCodeIndex(repo);
|
|
639
|
-
if (!index) {
|
|
640
|
-
throw new Error(`Repository not found: ${repo}`);
|
|
641
|
-
}
|
|
642
|
-
const componentName = options?.component_name;
|
|
643
|
-
const filePattern = options?.file_pattern;
|
|
644
|
-
const includeTests = options?.include_tests ?? false;
|
|
645
|
-
const maxEntries = options?.max_entries ?? 100;
|
|
646
|
-
// Filter symbols to components and hooks
|
|
647
|
-
let symbols = index.symbols.filter((s) => s.kind === "component" || s.kind === "hook");
|
|
648
|
-
if (!includeTests)
|
|
649
|
-
symbols = symbols.filter((s) => !isTestFile(s.file));
|
|
650
|
-
if (componentName)
|
|
651
|
-
symbols = symbols.filter((s) => s.name === componentName);
|
|
652
|
-
if (filePattern)
|
|
653
|
-
symbols = symbols.filter((s) => s.file.includes(filePattern));
|
|
654
|
-
const entries = [];
|
|
655
|
-
const globalHookCount = new Map();
|
|
656
|
-
let totalComponents = 0;
|
|
657
|
-
let totalHooks = 0;
|
|
658
|
-
let violationsCount = 0;
|
|
659
|
-
for (const sym of symbols) {
|
|
660
|
-
if (!sym.source)
|
|
661
|
-
continue;
|
|
662
|
-
const hookCalls = extractHookCalls(sym.source);
|
|
663
|
-
const violations = findRuleOfHooksViolations(sym.source);
|
|
664
|
-
if (sym.kind === "component")
|
|
665
|
-
totalComponents++;
|
|
666
|
-
else if (sym.kind === "hook")
|
|
667
|
-
totalHooks++;
|
|
668
|
-
// Skip empty entries (no hooks, no violations)
|
|
669
|
-
if (hookCalls.length === 0 && violations.length === 0)
|
|
670
|
-
continue;
|
|
671
|
-
violationsCount += violations.length;
|
|
672
|
-
for (const call of hookCalls) {
|
|
673
|
-
globalHookCount.set(call.name, (globalHookCount.get(call.name) ?? 0) + 1);
|
|
674
|
-
}
|
|
675
|
-
entries.push({
|
|
676
|
-
name: sym.name,
|
|
677
|
-
kind: sym.kind,
|
|
678
|
-
file: sym.file,
|
|
679
|
-
start_line: sym.start_line,
|
|
680
|
-
hook_count: hookCalls.length,
|
|
681
|
-
hooks: hookCalls,
|
|
682
|
-
violations,
|
|
683
|
-
});
|
|
684
|
-
if (entries.length >= maxEntries)
|
|
685
|
-
break;
|
|
686
|
-
}
|
|
687
|
-
// Sort entries: violations first, then by hook_count descending
|
|
688
|
-
entries.sort((a, b) => {
|
|
689
|
-
const vdiff = b.violations.length - a.violations.length;
|
|
690
|
-
if (vdiff !== 0)
|
|
691
|
-
return vdiff;
|
|
692
|
-
return b.hook_count - a.hook_count;
|
|
693
|
-
});
|
|
694
|
-
const hook_usage = [...globalHookCount.entries()]
|
|
695
|
-
.sort((a, b) => b[1] - a[1])
|
|
696
|
-
.slice(0, 20)
|
|
697
|
-
.map(([name, count]) => ({
|
|
698
|
-
name,
|
|
699
|
-
count,
|
|
700
|
-
is_stdlib: REACT_STDLIB_HOOKS.has(name),
|
|
701
|
-
}));
|
|
702
|
-
return {
|
|
703
|
-
entries,
|
|
704
|
-
total_components: totalComponents,
|
|
705
|
-
total_custom_hooks: totalHooks,
|
|
706
|
-
hook_usage,
|
|
707
|
-
violations_count: violationsCount,
|
|
708
|
-
};
|
|
709
|
-
}
|
|
710
|
-
/** Patterns for inline prop creation in JSX — each creates a new reference every render */
|
|
711
|
-
const INLINE_OBJECT_RE = /\b\w+\s*=\s*\{\s*\{/g; // prop={{ ... }}
|
|
712
|
-
const INLINE_ARRAY_RE = /\b\w+\s*=\s*\{\s*\[/g; // prop={[ ... ]}
|
|
713
|
-
const INLINE_FN_RE = /\bon[A-Z]\w*\s*=\s*\{\s*(?:\([^)]*\)|[a-z_$][\w$]*)\s*=>/g; // onX={() => ...}
|
|
714
|
-
/** Default prop values that create new references: = [] or = {} in params */
|
|
715
|
-
const UNSTABLE_DEFAULT_RE = /(?:[:,]\s*)(\w+)\s*=\s*(\[\s*\]|\{\s*\})/g;
|
|
716
|
-
/**
|
|
717
|
-
* Analyze a single component source for re-render risks.
|
|
718
|
-
*/
|
|
719
|
-
function findRenderRisks(source) {
|
|
720
|
-
const risks = [];
|
|
721
|
-
const lines = source.split("\n");
|
|
722
|
-
for (let i = 0; i < lines.length && risks.length < 20; i++) {
|
|
723
|
-
const line = lines[i];
|
|
724
|
-
const lineNum = i + 1;
|
|
725
|
-
const trimmed = line.trim();
|
|
726
|
-
// Skip comments
|
|
727
|
-
if (trimmed.startsWith("//") || trimmed.startsWith("*"))
|
|
728
|
-
continue;
|
|
729
|
-
// Inline object prop: prop={{ key: val }}
|
|
730
|
-
if (INLINE_OBJECT_RE.test(line)) {
|
|
731
|
-
INLINE_OBJECT_RE.lastIndex = 0;
|
|
732
|
-
risks.push({
|
|
733
|
-
type: "inline-object",
|
|
734
|
-
line: lineNum,
|
|
735
|
-
context: trimmed.slice(0, 120),
|
|
736
|
-
suggestion: "Extract to a const or useMemo — object literal creates new reference every render",
|
|
737
|
-
});
|
|
738
|
-
}
|
|
739
|
-
// Inline array prop: prop={[1, 2, 3]}
|
|
740
|
-
if (INLINE_ARRAY_RE.test(line)) {
|
|
741
|
-
INLINE_ARRAY_RE.lastIndex = 0;
|
|
742
|
-
risks.push({
|
|
743
|
-
type: "inline-array",
|
|
744
|
-
line: lineNum,
|
|
745
|
-
context: trimmed.slice(0, 120),
|
|
746
|
-
suggestion: "Extract to a const or useMemo — array literal creates new reference every render",
|
|
747
|
-
});
|
|
748
|
-
}
|
|
749
|
-
// Inline function in event handler: onClick={() => ...}
|
|
750
|
-
if (INLINE_FN_RE.test(line)) {
|
|
751
|
-
INLINE_FN_RE.lastIndex = 0;
|
|
752
|
-
risks.push({
|
|
753
|
-
type: "inline-function",
|
|
754
|
-
line: lineNum,
|
|
755
|
-
context: trimmed.slice(0, 120),
|
|
756
|
-
suggestion: "Extract to useCallback or a named handler — arrow function creates new reference every render",
|
|
757
|
-
});
|
|
758
|
-
}
|
|
759
|
-
// Unstable default value: { items = [], config = {} }
|
|
760
|
-
UNSTABLE_DEFAULT_RE.lastIndex = 0;
|
|
761
|
-
let dm;
|
|
762
|
-
while ((dm = UNSTABLE_DEFAULT_RE.exec(line)) !== null && risks.length < 20) {
|
|
763
|
-
risks.push({
|
|
764
|
-
type: "unstable-default",
|
|
765
|
-
line: lineNum,
|
|
766
|
-
context: trimmed.slice(0, 120),
|
|
767
|
-
suggestion: `Default value \`${dm[1]} = ${dm[2]}\` creates new reference every render — hoist to module const`,
|
|
768
|
-
});
|
|
769
|
-
}
|
|
770
|
-
}
|
|
771
|
-
return risks;
|
|
772
|
-
}
|
|
773
|
-
/**
|
|
774
|
-
* Format an AnalyzeRendersResult as human-readable Markdown.
|
|
775
|
-
* Used by analyzeRenders when format="markdown" is requested.
|
|
776
|
-
*/
|
|
777
|
-
export function formatRendersMarkdown(result) {
|
|
778
|
-
const lines = [];
|
|
779
|
-
lines.push("# Render Analysis");
|
|
780
|
-
lines.push("");
|
|
781
|
-
lines.push(`Total components: ${result.total_components} | High risk: ${result.high_risk_count}`);
|
|
782
|
-
lines.push("");
|
|
783
|
-
lines.push("## Summary");
|
|
784
|
-
lines.push(`- inline_objects: ${result.summary.inline_objects}`);
|
|
785
|
-
lines.push(`- inline_arrays: ${result.summary.inline_arrays}`);
|
|
786
|
-
lines.push(`- inline_functions: ${result.summary.inline_functions}`);
|
|
787
|
-
lines.push(`- unstable_defaults: ${result.summary.unstable_defaults}`);
|
|
788
|
-
lines.push(`- missing_memo: ${result.summary.missing_memo}`);
|
|
789
|
-
lines.push("");
|
|
790
|
-
lines.push("## Entries");
|
|
791
|
-
lines.push("");
|
|
792
|
-
lines.push("| Component | File | Risk | Issues | Children | Chain | Memo |");
|
|
793
|
-
lines.push("|-----------|------|------|--------|----------|-------|------|");
|
|
794
|
-
for (const e of result.entries) {
|
|
795
|
-
const file = e.file.length > 40 ? "…" + e.file.slice(-39) : e.file;
|
|
796
|
-
const chain = e.jsx_render_depth === null ? "—" : String(e.jsx_render_depth);
|
|
797
|
-
lines.push(`| ${e.name} | ${file}:${e.start_line} | ${e.risk_level} | ${e.risk_count} | ${e.children_count} | ${chain} | ${e.is_memoized ? "✓" : "✗"} |`);
|
|
798
|
-
}
|
|
799
|
-
return lines.join("\n");
|
|
800
|
-
}
|
|
801
|
-
/**
|
|
802
|
-
* Analyze re-render risk across React components in a repo.
|
|
803
|
-
*
|
|
804
|
-
* Detects:
|
|
805
|
-
* - Inline object/array/function props in JSX (new reference every render)
|
|
806
|
-
* - Unstable default parameter values ([] or {} in component params)
|
|
807
|
-
* - Components not wrapped in React.memo that render children (missing-memo)
|
|
808
|
-
*
|
|
809
|
-
* Returns per-component risk assessment with actionable suggestions.
|
|
810
|
-
*/
|
|
811
|
-
export async function analyzeRenders(repo, options) {
|
|
812
|
-
const index = await getCodeIndex(repo);
|
|
813
|
-
if (!index) {
|
|
814
|
-
throw new Error(`Repository not found: ${repo}`);
|
|
815
|
-
}
|
|
816
|
-
const componentName = options?.component_name;
|
|
817
|
-
const filePattern = options?.file_pattern;
|
|
818
|
-
const includeTests = options?.include_tests ?? false;
|
|
819
|
-
const maxEntries = options?.max_entries ?? 100;
|
|
820
|
-
let components = index.symbols.filter((s) => s.kind === "component");
|
|
821
|
-
if (!includeTests)
|
|
822
|
-
components = components.filter((s) => !isTestFile(s.file));
|
|
823
|
-
if (componentName)
|
|
824
|
-
components = components.filter((s) => s.name === componentName);
|
|
825
|
-
if (filePattern)
|
|
826
|
-
components = components.filter((s) => s.file.includes(filePattern));
|
|
827
|
-
// Tier 5 — extractor-failure: only when we have indexed JSX files but zero
|
|
828
|
-
// component symbols while other symbols exist — likely classification/extractor
|
|
829
|
-
// issues. Pure `.ts`/non-JSX indexes are not flagged (avoids false positives on
|
|
830
|
-
// headless/util libraries).
|
|
831
|
-
const hasJsxIndexedFiles = index.files.some((f) => f.path.endsWith(".tsx") || f.path.endsWith(".jsx"));
|
|
832
|
-
const extractorFailure = components.length === 0 &&
|
|
833
|
-
index.symbols.length > 0 &&
|
|
834
|
-
hasJsxIndexedFiles;
|
|
835
|
-
// Tier 5 — sort components alphabetically by id ?? name BEFORE building adjacency
|
|
836
|
-
// for deterministic cycle handling.
|
|
837
|
-
const sortedComponents = [...components].sort((a, b) => (a.id ?? a.name).localeCompare(b.id ?? b.name));
|
|
838
|
-
// Build reverse adjacency once, share memo across all per-component calls (O(V+E) total).
|
|
839
|
-
const adjacency = buildJsxAdjacency(sortedComponents);
|
|
840
|
-
const reverseAdj = buildReverseAdjacency(adjacency);
|
|
841
|
-
const memo = new Map();
|
|
842
|
-
const inProgress = new Set();
|
|
843
|
-
const entries = [];
|
|
844
|
-
const summary = { inline_objects: 0, inline_arrays: 0, inline_functions: 0, unstable_defaults: 0, missing_memo: 0 };
|
|
845
|
-
let highRiskCount = 0;
|
|
846
|
-
for (const sym of sortedComponents) {
|
|
847
|
-
if (entries.length >= maxEntries)
|
|
848
|
-
break;
|
|
849
|
-
if (!sym.source)
|
|
850
|
-
continue;
|
|
851
|
-
const isMemoized = /\b(?:React\.)?memo\s*\(/.test(sym.source);
|
|
852
|
-
const risks = findRenderRisks(sym.source);
|
|
853
|
-
// Count children rendered (PascalCase JSX elements)
|
|
854
|
-
const childrenSet = new Set();
|
|
855
|
-
const jsxPattern = /<([A-Z][a-zA-Z0-9_$]*)\b/g;
|
|
856
|
-
let jm;
|
|
857
|
-
while ((jm = jsxPattern.exec(sym.source)) !== null) {
|
|
858
|
-
if (jm[1] !== sym.name)
|
|
859
|
-
childrenSet.add(jm[1]);
|
|
860
|
-
}
|
|
861
|
-
// Check missing-memo: component renders children and is not memoized
|
|
862
|
-
if (!isMemoized && childrenSet.size > 0 && risks.length > 0) {
|
|
863
|
-
risks.push({
|
|
864
|
-
type: "missing-memo",
|
|
865
|
-
line: 1,
|
|
866
|
-
context: `${sym.name} renders ${childrenSet.size} child component(s) and has ${risks.length} inline props`,
|
|
867
|
-
suggestion: "Wrap in React.memo() — parent re-renders will propagate to children via new prop references",
|
|
868
|
-
});
|
|
869
|
-
summary.missing_memo++;
|
|
870
|
-
}
|
|
871
|
-
// Aggregate summary counts
|
|
872
|
-
for (const r of risks) {
|
|
873
|
-
if (r.type === "inline-object")
|
|
874
|
-
summary.inline_objects++;
|
|
875
|
-
else if (r.type === "inline-array")
|
|
876
|
-
summary.inline_arrays++;
|
|
877
|
-
else if (r.type === "inline-function")
|
|
878
|
-
summary.inline_functions++;
|
|
879
|
-
else if (r.type === "unstable-default")
|
|
880
|
-
summary.unstable_defaults++;
|
|
881
|
-
}
|
|
882
|
-
// Risk level classification — factors children_count to amplify components
|
|
883
|
-
// that propagate prop instability to many children (Bug #4 fix).
|
|
884
|
-
const riskLevel = ((risks.length >= 3 && childrenSet.size >= 3) || risks.length >= 5) ? "high" :
|
|
885
|
-
(risks.length >= 2 || (risks.length >= 1 && childrenSet.size >= 1)) ? "medium" : "low";
|
|
886
|
-
if (riskLevel === "high")
|
|
887
|
-
highRiskCount++;
|
|
888
|
-
// Tier 5 — render-tree depth (longest acyclic path from this component up to a root).
|
|
889
|
-
// `reverseAdj` is keyed by `sym.id` exclusively (see line 130), so any fallback to
|
|
890
|
-
// sym.name would silently look up a non-existent key. CodeSymbol.id is required by
|
|
891
|
-
// the type contract — dropping the prior `?? sym.name` fallback that masked unset id.
|
|
892
|
-
const depth = computePropChainDepth(sym.id, reverseAdj, memo, inProgress);
|
|
893
|
-
// Tier 5 — suggestion text with explicit "NOT prop-drilling depth" disclaimer
|
|
894
|
-
// when depth >= 3 (AC 8: prevents the metric from being silently relabeled
|
|
895
|
-
// as semantic prop-flow depth, which is Tier 6 scope).
|
|
896
|
-
const suggestion = depth >= 3
|
|
897
|
-
? `Component is rendered ${depth} edges deep in the JSX render tree. NOT prop-drilling depth — this metric measures render-tree depth only, without tracing which props are consumed vs passed through. Use as a hint to investigate; combine with manual review or trace_component_tree to confirm whether props are actually being drilled. Semantic prop-flow tracking is Tier 6 scope.`
|
|
898
|
-
: undefined;
|
|
899
|
-
// Only include components with risks or if specifically queried
|
|
900
|
-
if (risks.length > 0 || componentName) {
|
|
901
|
-
entries.push({
|
|
902
|
-
name: sym.name,
|
|
903
|
-
file: sym.file,
|
|
904
|
-
start_line: sym.start_line,
|
|
905
|
-
is_memoized: isMemoized,
|
|
906
|
-
risk_count: risks.length,
|
|
907
|
-
risk_level: riskLevel,
|
|
908
|
-
risks,
|
|
909
|
-
children_count: childrenSet.size,
|
|
910
|
-
jsx_render_depth: extractorFailure ? null : depth,
|
|
911
|
-
prop_chain_depth: extractorFailure ? null : depth,
|
|
912
|
-
...(suggestion ? { suggestion } : {}),
|
|
913
|
-
});
|
|
914
|
-
}
|
|
915
|
-
}
|
|
916
|
-
// Sort: high risk first, then by risk_count descending
|
|
917
|
-
entries.sort((a, b) => {
|
|
918
|
-
const levelOrder = { high: 3, medium: 2, low: 1 };
|
|
919
|
-
const ld = levelOrder[b.risk_level] - levelOrder[a.risk_level];
|
|
920
|
-
if (ld !== 0)
|
|
921
|
-
return ld;
|
|
922
|
-
return b.risk_count - a.risk_count;
|
|
923
|
-
});
|
|
924
|
-
const jsonResult = {
|
|
925
|
-
entries,
|
|
926
|
-
total_components: components.length,
|
|
927
|
-
high_risk_count: highRiskCount,
|
|
928
|
-
summary,
|
|
929
|
-
...(extractorFailure ? { metadata: { skipped: "extractor-failure" } } : {}),
|
|
930
|
-
};
|
|
931
|
-
if (options?.format === "markdown") {
|
|
932
|
-
return formatRendersMarkdown(jsonResult);
|
|
933
|
-
}
|
|
934
|
-
return jsonResult;
|
|
935
|
-
}
|
|
936
|
-
const MAX_CONTEXT_SYMBOLS = 500;
|
|
937
|
-
/**
|
|
938
|
-
* Build a graph of React Context flows: createContext → Provider → useContext consumers.
|
|
939
|
-
*
|
|
940
|
-
* Single-pass scan over all symbols (capped at 500). No cycle detection — relies
|
|
941
|
-
* on visited set keyed by context name to prevent re-processing.
|
|
942
|
-
*
|
|
943
|
-
* Detection patterns:
|
|
944
|
-
* - createContext call: `const X = createContext(...)` or `const X = React.createContext(...)`
|
|
945
|
-
* - Provider usage: `<X.Provider value={...}>` (anywhere in any source)
|
|
946
|
-
* - Consumer usage: `useContext(X)` (anywhere in any source)
|
|
947
|
-
*
|
|
948
|
-
* Phase 2 features (not implemented here):
|
|
949
|
-
* - Cycle detection in provider chains
|
|
950
|
-
* - Re-render impact analysis ("which consumers re-render when X changes")
|
|
951
|
-
* - Context value type tracking
|
|
952
|
-
*/
|
|
953
|
-
export function buildContextGraph(symbols) {
|
|
954
|
-
const contexts = new Map();
|
|
955
|
-
const createPattern = /\bconst\s+(\w+)\s*(?::[^=]+)?\s*=\s*(?:React\.)?createContext\b/g;
|
|
956
|
-
// Pass 1: Find context definitions
|
|
957
|
-
let scanned = 0;
|
|
958
|
-
for (const sym of symbols) {
|
|
959
|
-
if (scanned >= MAX_CONTEXT_SYMBOLS)
|
|
960
|
-
break;
|
|
961
|
-
if (!sym.source)
|
|
962
|
-
continue;
|
|
963
|
-
scanned++;
|
|
964
|
-
let m;
|
|
965
|
-
createPattern.lastIndex = 0;
|
|
966
|
-
while ((m = createPattern.exec(sym.source)) !== null) {
|
|
967
|
-
const name = m[1];
|
|
968
|
-
if (contexts.has(name))
|
|
969
|
-
continue; // visited — skip duplicate definition
|
|
970
|
-
// Compute line offset within symbol source
|
|
971
|
-
const linesBefore = sym.source.slice(0, m.index).split("\n").length;
|
|
972
|
-
contexts.set(name, {
|
|
973
|
-
name,
|
|
974
|
-
created_in: { file: sym.file, line: sym.start_line + linesBefore - 1 },
|
|
975
|
-
providers: [],
|
|
976
|
-
consumers: [],
|
|
977
|
-
});
|
|
978
|
-
}
|
|
979
|
-
}
|
|
980
|
-
if (contexts.size === 0)
|
|
981
|
-
return { contexts: [] };
|
|
982
|
-
// Pass 2: Find providers and consumers
|
|
983
|
-
scanned = 0;
|
|
984
|
-
for (const sym of symbols) {
|
|
985
|
-
if (scanned >= MAX_CONTEXT_SYMBOLS)
|
|
986
|
-
break;
|
|
987
|
-
if (!sym.source)
|
|
988
|
-
continue;
|
|
989
|
-
if (sym.kind !== "component" && sym.kind !== "hook")
|
|
990
|
-
continue;
|
|
991
|
-
scanned++;
|
|
992
|
-
for (const [ctxName, info] of contexts) {
|
|
993
|
-
// Provider: <X.Provider
|
|
994
|
-
const providerRe = new RegExp(`<${ctxName}\\.Provider\\b`);
|
|
995
|
-
if (providerRe.test(sym.source)) {
|
|
996
|
-
info.providers.push({ file: sym.file, line: sym.start_line });
|
|
997
|
-
}
|
|
998
|
-
// Consumer: useContext(X)
|
|
999
|
-
const consumerRe = new RegExp(`useContext\\s*\\(\\s*${ctxName}\\b`);
|
|
1000
|
-
if (consumerRe.test(sym.source)) {
|
|
1001
|
-
info.consumers.push({
|
|
1002
|
-
file: sym.file,
|
|
1003
|
-
component: sym.name,
|
|
1004
|
-
line: sym.start_line,
|
|
1005
|
-
});
|
|
1006
|
-
}
|
|
1007
|
-
}
|
|
1008
|
-
}
|
|
1009
|
-
return { contexts: [...contexts.values()] };
|
|
1010
|
-
}
|
|
1011
|
-
// ─────────────────────────────────────────────────────────────
|
|
1012
|
-
// audit_compiler_readiness — React Compiler adoption readiness
|
|
1013
|
-
// ─────────────────────────────────────────────────────────────
|
|
1014
|
-
const COMPILER_PATTERNS = [
|
|
1015
|
-
"compiler-side-effect-in-render",
|
|
1016
|
-
"compiler-ref-read-in-render",
|
|
1017
|
-
"compiler-prop-mutation",
|
|
1018
|
-
"compiler-state-mutation",
|
|
1019
|
-
"compiler-try-catch-bailout",
|
|
1020
|
-
"compiler-redundant-memo",
|
|
1021
|
-
"compiler-redundant-usecallback",
|
|
1022
|
-
];
|
|
1023
|
-
/**
|
|
1024
|
-
* Audit a React codebase for React Compiler (v1.0) adoption readiness.
|
|
1025
|
-
*
|
|
1026
|
-
* Scans all components for patterns that cause the compiler to silently
|
|
1027
|
-
* bail out of auto-memoization. Returns a readiness score (0-100) with
|
|
1028
|
-
* prioritized fix list.
|
|
1029
|
-
*
|
|
1030
|
-
* No competitor offers codebase-wide compiler readiness analysis.
|
|
1031
|
-
*/
|
|
1032
|
-
export async function auditCompilerReadiness(repo, options) {
|
|
1033
|
-
const { searchPatterns } = await import("./pattern-tools.js");
|
|
1034
|
-
const index = await getCodeIndex(repo);
|
|
1035
|
-
if (!index)
|
|
1036
|
-
throw new Error(`Repository not found: ${repo}`);
|
|
1037
|
-
const includeTests = options?.include_tests ?? false;
|
|
1038
|
-
const filePattern = options?.file_pattern;
|
|
1039
|
-
// Count total components
|
|
1040
|
-
let components = index.symbols.filter((s) => s.kind === "component");
|
|
1041
|
-
if (!includeTests)
|
|
1042
|
-
components = components.filter((s) => !isTestFile(s.file));
|
|
1043
|
-
if (filePattern)
|
|
1044
|
-
components = components.filter((s) => s.file.includes(filePattern));
|
|
1045
|
-
const totalComponents = components.length;
|
|
1046
|
-
// Run all compiler patterns in parallel
|
|
1047
|
-
const patternResults = await Promise.all(COMPILER_PATTERNS.map(async (pattern) => {
|
|
1048
|
-
try {
|
|
1049
|
-
const result = await searchPatterns(repo, pattern, {
|
|
1050
|
-
file_pattern: filePattern,
|
|
1051
|
-
include_tests: includeTests,
|
|
1052
|
-
max_results: 200,
|
|
1053
|
-
});
|
|
1054
|
-
return { pattern, matches: result.matches, description: result.pattern };
|
|
1055
|
-
}
|
|
1056
|
-
catch {
|
|
1057
|
-
return { pattern, matches: [], description: pattern };
|
|
1058
|
-
}
|
|
1059
|
-
}));
|
|
1060
|
-
// Aggregate: which components have bailout issues
|
|
1061
|
-
const componentIssues = new Map(); // "name@file" → issue count
|
|
1062
|
-
let redundantMemoization = 0;
|
|
1063
|
-
const issues = [];
|
|
1064
|
-
for (const { pattern, matches, description } of patternResults) {
|
|
1065
|
-
if (matches.length === 0)
|
|
1066
|
-
continue;
|
|
1067
|
-
const isRedundant = pattern === "compiler-redundant-memo" || pattern === "compiler-redundant-usecallback";
|
|
1068
|
-
if (isRedundant) {
|
|
1069
|
-
redundantMemoization += matches.length;
|
|
1070
|
-
}
|
|
1071
|
-
issues.push({
|
|
1072
|
-
pattern,
|
|
1073
|
-
count: matches.length,
|
|
1074
|
-
description: description.split(": ").slice(1).join(": ") || description,
|
|
1075
|
-
});
|
|
1076
|
-
for (const m of matches) {
|
|
1077
|
-
if (!isRedundant) {
|
|
1078
|
-
const key = `${m.name}@${m.file}`;
|
|
1079
|
-
componentIssues.set(key, (componentIssues.get(key) ?? 0) + 1);
|
|
1080
|
-
}
|
|
1081
|
-
}
|
|
1082
|
-
}
|
|
1083
|
-
// Sort issues by count descending
|
|
1084
|
-
issues.sort((a, b) => b.count - a.count);
|
|
1085
|
-
// Top bailout components
|
|
1086
|
-
const top_bailout_components = [...componentIssues.entries()]
|
|
1087
|
-
.sort((a, b) => b[1] - a[1])
|
|
1088
|
-
.slice(0, 10)
|
|
1089
|
-
.map(([key, count]) => {
|
|
1090
|
-
const [name, file] = key.split("@");
|
|
1091
|
-
return { name: name, file: file, issues: count };
|
|
1092
|
-
});
|
|
1093
|
-
const bailoutCount = componentIssues.size;
|
|
1094
|
-
const compatibleCount = Math.max(0, totalComponents - bailoutCount);
|
|
1095
|
-
// Readiness score: percentage of components without bailout issues
|
|
1096
|
-
const readiness_score = totalComponents > 0
|
|
1097
|
-
? Math.round((compatibleCount / totalComponents) * 100)
|
|
1098
|
-
: 100; // empty repo = ready
|
|
1099
|
-
return {
|
|
1100
|
-
readiness_score,
|
|
1101
|
-
total_components: totalComponents,
|
|
1102
|
-
compatible_components: compatibleCount,
|
|
1103
|
-
bailout_components: bailoutCount,
|
|
1104
|
-
redundant_memoization: redundantMemoization,
|
|
1105
|
-
issues,
|
|
1106
|
-
top_bailout_components,
|
|
1107
|
-
};
|
|
1108
|
-
}
|
|
1109
|
-
/**
|
|
1110
|
-
* Day-1 onboarding composite for React projects. Single call that runs:
|
|
1111
|
-
* - Component/hook inventory
|
|
1112
|
-
* - Stack detection (state mgmt, routing, UI lib, form lib, build tool)
|
|
1113
|
-
* - Critical pattern scan (XSS, Rule of Hooks, memory leaks)
|
|
1114
|
-
* - Top hook usage summary
|
|
1115
|
-
* - Suggested follow-up queries
|
|
1116
|
-
*
|
|
1117
|
-
* Meant to be the first tool a React developer runs on an unfamiliar codebase.
|
|
1118
|
-
* Replaces 5-6 manual tool calls with one structured report.
|
|
1119
|
-
*/
|
|
1120
|
-
export async function reactQuickstart(repo) {
|
|
1121
|
-
const { searchPatterns } = await import("./pattern-tools.js");
|
|
1122
|
-
const { analyzeProject } = await import("./project-tools.js");
|
|
1123
|
-
const index = await getCodeIndex(repo);
|
|
1124
|
-
if (!index)
|
|
1125
|
-
throw new Error(`Repository not found: ${repo}`);
|
|
1126
|
-
// Inventory
|
|
1127
|
-
const components = index.symbols.filter((s) => s.kind === "component" && !isTestFile(s.file));
|
|
1128
|
-
const hooks = index.symbols.filter((s) => s.kind === "hook" && !isTestFile(s.file));
|
|
1129
|
-
// Find likely root component: prefer App > Root > Main > Layout > Page
|
|
1130
|
-
const rootNames = ["App", "Root", "Main", "Layout", "Page"];
|
|
1131
|
-
const likelyRoot = components.find((c) => rootNames.includes(c.name))?.name
|
|
1132
|
-
?? components[0]?.name
|
|
1133
|
-
?? null;
|
|
1134
|
-
// Stack detection via analyze_project
|
|
1135
|
-
let stack = {
|
|
1136
|
-
state_management: null,
|
|
1137
|
-
routing: null,
|
|
1138
|
-
ui_library: null,
|
|
1139
|
-
form_library: null,
|
|
1140
|
-
build_tool: null,
|
|
1141
|
-
};
|
|
1142
|
-
try {
|
|
1143
|
-
const proj = await analyzeProject(repo, { force: false });
|
|
1144
|
-
const rc = proj?.conventions?.react_conventions;
|
|
1145
|
-
const si = proj?.stack;
|
|
1146
|
-
if (rc) {
|
|
1147
|
-
stack = {
|
|
1148
|
-
state_management: rc.state_management ?? null,
|
|
1149
|
-
routing: rc.routing ?? null,
|
|
1150
|
-
ui_library: rc.ui_library ?? null,
|
|
1151
|
-
form_library: rc.form_library ?? null,
|
|
1152
|
-
build_tool: si?.build_tool ?? null,
|
|
1153
|
-
};
|
|
1154
|
-
}
|
|
1155
|
-
else if (si) {
|
|
1156
|
-
stack.build_tool = si.build_tool ?? null;
|
|
1157
|
-
}
|
|
1158
|
-
}
|
|
1159
|
-
catch {
|
|
1160
|
-
// analyze_project may fail on non-React repos — fall through
|
|
1161
|
-
}
|
|
1162
|
-
// Critical pattern scans — run in parallel.
|
|
1163
|
-
// Tier 5: scan list expanded with new patterns, results routed to severity-based buckets.
|
|
1164
|
-
const scanList = [
|
|
1165
|
-
{ name: "dangerously-set-html", severity: "critical" },
|
|
1166
|
-
{ name: "hook-in-condition", severity: "critical" },
|
|
1167
|
-
{ name: "conditional-render-hook", severity: "critical" },
|
|
1168
|
-
{ name: "useEffect-missing-cleanup", severity: "warning" },
|
|
1169
|
-
{ name: "useEffect-setstate-loop", severity: "critical" },
|
|
1170
|
-
{ name: "rsc-non-serializable-prop", severity: "warning" },
|
|
1171
|
-
// Tier 5 — warning bucket
|
|
1172
|
-
{ name: "derived-state", severity: "warning" },
|
|
1173
|
-
{ name: "stale-closure-setstate", severity: "warning" },
|
|
1174
|
-
{ name: "context-provider-value-inline", severity: "warning" },
|
|
1175
|
-
// Tier 5 — warning (tabnabbing): surfaced in critical_issues with legacy warnings
|
|
1176
|
-
{ name: "jsx-no-target-blank", severity: "warning" },
|
|
1177
|
-
{ name: "button-no-type", severity: "style" },
|
|
1178
|
-
// Tier 6 — extending Tier 5 coverage
|
|
1179
|
-
{ name: "derived-state-reducer", severity: "warning" },
|
|
1180
|
-
{ name: "derived-state-custom-setter", severity: "warning" },
|
|
1181
|
-
{ name: "stale-closure-toggle", severity: "warning" },
|
|
1182
|
-
{ name: "stale-closure-broken-functional", severity: "warning" },
|
|
1183
|
-
{ name: "context-provider-value-via-variable", severity: "warning" },
|
|
1184
|
-
{ name: "context-provider-value-inline-destructured", severity: "warning" },
|
|
1185
|
-
{ name: "react-lazy-no-suspense-same-file", severity: "style" },
|
|
1186
|
-
{ name: "rsc-non-serializable-prop-deep", severity: "critical" },
|
|
1187
|
-
{ name: "error-boundary-incomplete", severity: "warning" },
|
|
1188
|
-
];
|
|
1189
|
-
const scanResults = await Promise.all(scanList.map(async ({ name, severity }) => {
|
|
1190
|
-
try {
|
|
1191
|
-
const result = await searchPatterns(repo, name, { max_results: 20 });
|
|
1192
|
-
return { pattern: name, count: result.matches.length, severity };
|
|
1193
|
-
}
|
|
1194
|
-
catch {
|
|
1195
|
-
return { pattern: name, count: 0, severity };
|
|
1196
|
-
}
|
|
1197
|
-
}));
|
|
1198
|
-
// Severity-aware bucketing — cap each at 10 entries.
|
|
1199
|
-
const hits = scanResults.filter((r) => r.count > 0);
|
|
1200
|
-
const critical_issues = hits
|
|
1201
|
-
.filter((r) => r.severity === "critical")
|
|
1202
|
-
.slice(0, 10);
|
|
1203
|
-
// Legacy: pre-Tier-5 patterns marked "warning" stay in critical_issues for backward compat;
|
|
1204
|
-
// Tier 5 warnings (derived-state, stale-closure, context-provider) go to dedicated bucket.
|
|
1205
|
-
const tier5WarningPatterns = new Set([
|
|
1206
|
-
// Tier 5
|
|
1207
|
-
"derived-state", "stale-closure-setstate", "context-provider-value-inline",
|
|
1208
|
-
// Tier 6 — same warning bucket
|
|
1209
|
-
"derived-state-reducer", "derived-state-custom-setter",
|
|
1210
|
-
"stale-closure-toggle", "stale-closure-broken-functional",
|
|
1211
|
-
"context-provider-value-via-variable", "context-provider-value-inline-destructured",
|
|
1212
|
-
"error-boundary-incomplete",
|
|
1213
|
-
]);
|
|
1214
|
-
for (const r of hits) {
|
|
1215
|
-
if (r.severity === "warning" && !tier5WarningPatterns.has(r.pattern) && critical_issues.length < 10) {
|
|
1216
|
-
critical_issues.push({ pattern: r.pattern, count: r.count, severity: "warning" });
|
|
1217
|
-
}
|
|
1218
|
-
}
|
|
1219
|
-
const warnings = hits
|
|
1220
|
-
.filter((r) => r.severity === "warning" && tier5WarningPatterns.has(r.pattern))
|
|
1221
|
-
.slice(0, 10);
|
|
1222
|
-
const style_issues = hits
|
|
1223
|
-
.filter((r) => r.severity === "style")
|
|
1224
|
-
.slice(0, 10);
|
|
1225
|
-
// Top hooks used across components
|
|
1226
|
-
const hookCounts = new Map();
|
|
1227
|
-
for (const c of components) {
|
|
1228
|
-
if (!c.source)
|
|
1229
|
-
continue;
|
|
1230
|
-
const matches = c.source.matchAll(/\b(use[A-Z]\w*)\s*\(/g);
|
|
1231
|
-
for (const m of matches) {
|
|
1232
|
-
const name = m[1];
|
|
1233
|
-
hookCounts.set(name, (hookCounts.get(name) ?? 0) + 1);
|
|
1234
|
-
}
|
|
1235
|
-
}
|
|
1236
|
-
const top_hooks = [...hookCounts.entries()]
|
|
1237
|
-
.sort((a, b) => b[1] - a[1])
|
|
1238
|
-
.slice(0, 5)
|
|
1239
|
-
.map(([name, count]) => ({ name, count }));
|
|
1240
|
-
// Suggested next queries
|
|
1241
|
-
const suggested_queries = [];
|
|
1242
|
-
if (likelyRoot) {
|
|
1243
|
-
suggested_queries.push(`trace_component_tree("${likelyRoot}") // explore render hierarchy`);
|
|
1244
|
-
}
|
|
1245
|
-
suggested_queries.push(`analyze_renders() // find re-render risks`);
|
|
1246
|
-
suggested_queries.push(`analyze_hooks() // Rule of Hooks + hook inventory`);
|
|
1247
|
-
if (components.length >= 10) {
|
|
1248
|
-
suggested_queries.push(`audit_compiler_readiness() // React Compiler adoption check`);
|
|
1249
|
-
}
|
|
1250
|
-
if (critical_issues.some((i) => i.severity === "critical")) {
|
|
1251
|
-
suggested_queries.push(`search_patterns("dangerously-set-html") // investigate XSS risks`);
|
|
1252
|
-
}
|
|
1253
|
-
return {
|
|
1254
|
-
overview: {
|
|
1255
|
-
total_components: components.length,
|
|
1256
|
-
total_custom_hooks: hooks.length,
|
|
1257
|
-
likely_root_component: likelyRoot,
|
|
1258
|
-
stack,
|
|
1259
|
-
},
|
|
1260
|
-
critical_issues,
|
|
1261
|
-
warnings,
|
|
1262
|
-
style_issues,
|
|
1263
|
-
top_hooks,
|
|
1264
|
-
suggested_queries,
|
|
1265
|
-
};
|
|
1266
|
-
}
|
|
4
|
+
* Compatibility facade: implementation lives in per-capability modules.
|
|
5
|
+
*/
|
|
6
|
+
export { REACT_STDLIB_HOOKS } from "./react-shared-tools.js";
|
|
7
|
+
export { buildJsxAdjacency, buildComponentTree, extractJsxComponents, buildReverseAdjacency, computePropChainDepth, traceComponentTree, } from "./react-component-tree-tools.js";
|
|
8
|
+
export { findSuspenseAncestor, findLazyComponentsWithoutSuspense, } from "./react-suspense-tools.js";
|
|
9
|
+
export { extractHookCalls, extractHookNames, findRuleOfHooksViolations, analyzeHooks, } from "./react-hooks-tools.js";
|
|
10
|
+
export { findRenderRisks, formatRendersMarkdown, analyzeRenders, } from "./react-render-tools.js";
|
|
11
|
+
export { buildContextGraph } from "./react-context-tools.js";
|
|
12
|
+
export { auditCompilerReadiness } from "./react-compiler-tools.js";
|
|
13
|
+
export { reactQuickstart } from "./react-quickstart-tools.js";
|
|
1267
14
|
//# sourceMappingURL=react-tools.js.map
|