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
package/dist/tools/sql-tools.js
CHANGED
|
@@ -1,1235 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* SQL analysis tools
|
|
3
|
-
* Hidden/discoverable: not in CORE_TOOL_NAMES.
|
|
4
|
-
*/
|
|
5
|
-
import { getCodeIndex } from "./index-tools.js";
|
|
6
|
-
import { searchText } from "./search-tools.js";
|
|
7
|
-
/**
|
|
8
|
-
* Infer SQL dialect from schema source fingerprints.
|
|
9
|
-
*
|
|
10
|
-
* Signals (in priority order):
|
|
11
|
-
* - mysql: ENGINE=InnoDB / ENGINE=MyISAM / AUTO_INCREMENT / utf8mb4 / backtick idents
|
|
12
|
-
* - postgres: SERIAL / BIGSERIAL / JSONB / RETURNING / USING gist / CITEXT
|
|
13
|
-
* - sqlite: AUTOINCREMENT (one word) / WITHOUT ROWID / sqlite_master
|
|
14
|
-
* - mssql: NVARCHAR / IDENTITY(\d, \d) / GO\n batch separator / [bracket] idents
|
|
15
|
-
*
|
|
16
|
-
* Returns "unknown" if no signal fires (e.g. dialect-neutral CREATE TABLE).
|
|
17
|
-
* Exported for unit-test independence and for callers that want a quick check
|
|
18
|
-
* without going through {@link analyzeSchema}.
|
|
19
|
-
*/
|
|
20
|
-
export function detectSqlDialect(source) {
|
|
21
|
-
if (!source)
|
|
22
|
-
return "unknown";
|
|
23
|
-
// MySQL signals are the most specific — score first.
|
|
24
|
-
if (/\bENGINE\s*=\s*(?:InnoDB|MyISAM|MEMORY|Aria)\b/i.test(source) ||
|
|
25
|
-
/\bAUTO_INCREMENT\b/i.test(source) ||
|
|
26
|
-
/\butf8mb4\b/i.test(source))
|
|
27
|
-
return "mysql";
|
|
28
|
-
// Postgres: SERIAL / JSONB / RETURNING are unmistakable.
|
|
29
|
-
if (/\b(?:BIG)?SERIAL\b/i.test(source) ||
|
|
30
|
-
/\bJSONB\b/i.test(source) ||
|
|
31
|
-
/\bCITEXT\b/i.test(source) ||
|
|
32
|
-
/\bRETURNING\b/i.test(source))
|
|
33
|
-
return "postgres";
|
|
34
|
-
// SQLite: AUTOINCREMENT (no underscore) / WITHOUT ROWID.
|
|
35
|
-
if (/\bAUTOINCREMENT\b/i.test(source) ||
|
|
36
|
-
/\bWITHOUT\s+ROWID\b/i.test(source))
|
|
37
|
-
return "sqlite";
|
|
38
|
-
// MS SQL Server: NVARCHAR / IDENTITY(seed, step) / square-bracket idents.
|
|
39
|
-
if (/\bNVARCHAR\b/i.test(source) ||
|
|
40
|
-
/\bIDENTITY\s*\(\s*\d+\s*,\s*\d+\s*\)/i.test(source))
|
|
41
|
-
return "mssql";
|
|
42
|
-
return "unknown";
|
|
43
|
-
}
|
|
44
|
-
// REFERENCES clause — supports unquoted, "double-quoted" (Postgres),
|
|
45
|
-
// `backtick` (MySQL), and [bracket] (SQL Server) identifiers. Schema-qualified
|
|
46
|
-
// names ("schema.table") are accepted; we keep only the table portion.
|
|
47
|
-
// Capture layout:
|
|
48
|
-
// 1: schema "..", 2: schema `..`, 3: schema [..], 4: schema unquoted
|
|
49
|
-
// 5: table "..", 6: table `..`, 7: table [..], 8: table unquoted
|
|
50
|
-
// 9: column "..",10: column `..`,11: column [..],12: column unquoted
|
|
51
|
-
const FK_RE = /REFERENCES\s+(?:(?:"([^"]+)"|`([^`]+)`|\[([^\]]+)\]|(\w+))\s*\.\s*)?(?:"([^"]+)"|`([^`]+)`|\[([^\]]+)\]|(\w+))\s*\(\s*(?:"([^"]+)"|`([^`]+)`|\[([^\]]+)\]|(\w+))\s*\)/gi;
|
|
52
|
-
export async function analyzeSchema(repo, options) {
|
|
53
|
-
const index = await getCodeIndex(repo);
|
|
54
|
-
if (!index) {
|
|
55
|
-
throw new Error(`Repository "${repo}" not found. Run index_folder first.`);
|
|
56
|
-
}
|
|
57
|
-
const includeColumns = options?.include_columns ?? true;
|
|
58
|
-
const filePattern = options?.file_pattern;
|
|
59
|
-
// Collect tables and views from index
|
|
60
|
-
const tables = [];
|
|
61
|
-
const views = [];
|
|
62
|
-
const warnings = [];
|
|
63
|
-
const tableSymbols = index.symbols.filter((s) => (s.kind === "table" || s.kind === "view") &&
|
|
64
|
-
(!filePattern || s.file.includes(filePattern)));
|
|
65
|
-
if (tableSymbols.length === 0) {
|
|
66
|
-
warnings.push("No SQL files indexed in this repository.");
|
|
67
|
-
return { tables, views, relationships: [], warnings, detected_dialect: "unknown" };
|
|
68
|
-
}
|
|
69
|
-
// Check for duplicate table names
|
|
70
|
-
const nameCounts = new Map();
|
|
71
|
-
for (const sym of tableSymbols) {
|
|
72
|
-
nameCounts.set(sym.name, (nameCounts.get(sym.name) ?? 0) + 1);
|
|
73
|
-
}
|
|
74
|
-
for (const [name, count] of nameCounts) {
|
|
75
|
-
if (count > 1) {
|
|
76
|
-
warnings.push(`Duplicate table/view name "${name}" found in ${count} files.`);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
for (const sym of tableSymbols) {
|
|
80
|
-
if (sym.kind === "view") {
|
|
81
|
-
views.push({ name: sym.name, file: sym.file, line: sym.start_line });
|
|
82
|
-
continue;
|
|
83
|
-
}
|
|
84
|
-
const columns = [];
|
|
85
|
-
if (includeColumns) {
|
|
86
|
-
const fields = index.symbols.filter((f) => f.kind === "field" && f.parent === sym.id);
|
|
87
|
-
for (const f of fields) {
|
|
88
|
-
columns.push({ name: f.name, type: f.signature ?? "unknown" });
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
tables.push({
|
|
92
|
-
name: sym.name,
|
|
93
|
-
file: sym.file,
|
|
94
|
-
line: sym.start_line,
|
|
95
|
-
columns,
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
// Extract FK relationships from column signatures + table-level constraints
|
|
99
|
-
const relationships = [];
|
|
100
|
-
for (const table of tables) {
|
|
101
|
-
// Column-level REFERENCES
|
|
102
|
-
for (const col of table.columns) {
|
|
103
|
-
FK_RE.lastIndex = 0;
|
|
104
|
-
const m = FK_RE.exec(col.type);
|
|
105
|
-
if (m) {
|
|
106
|
-
// Prefer table groups (5..8); fall back to schema groups (1..4) on weird inputs.
|
|
107
|
-
const toTable = m[5] ?? m[6] ?? m[7] ?? m[8] ?? m[1] ?? m[2] ?? m[3] ?? m[4] ?? "";
|
|
108
|
-
const toCol = m[9] ?? m[10] ?? m[11] ?? m[12] ?? "id";
|
|
109
|
-
let relType = "fk";
|
|
110
|
-
if (toTable === table.name) {
|
|
111
|
-
relType = "self_reference";
|
|
112
|
-
}
|
|
113
|
-
relationships.push({
|
|
114
|
-
from_table: table.name,
|
|
115
|
-
from_column: col.name,
|
|
116
|
-
to_table: toTable,
|
|
117
|
-
to_column: toCol,
|
|
118
|
-
type: relType,
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
// Table-level FOREIGN KEY constraints: scan full table source
|
|
123
|
-
const tableSym = index.symbols.find((s) => s.kind === "table" && s.name === table.name);
|
|
124
|
-
if (tableSym?.source) {
|
|
125
|
-
// Table-level FOREIGN KEY constraint — same identifier shapes as FK_RE.
|
|
126
|
-
// Capture layout:
|
|
127
|
-
// 1..4: from-column "..", `..`, [..], unquoted
|
|
128
|
-
// 5..8: schema-qualified prefix (any quoting) — discarded
|
|
129
|
-
// 9..12: target table
|
|
130
|
-
// 13..16: target column
|
|
131
|
-
const tableFkRe = /FOREIGN\s+KEY\s*\(\s*(?:"([^"]+)"|`([^`]+)`|\[([^\]]+)\]|(\w+))\s*\)\s*REFERENCES\s+(?:(?:"([^"]+)"|`([^`]+)`|\[([^\]]+)\]|(\w+))\s*\.\s*)?(?:"([^"]+)"|`([^`]+)`|\[([^\]]+)\]|(\w+))\s*\(\s*(?:"([^"]+)"|`([^`]+)`|\[([^\]]+)\]|(\w+))\s*\)/gi;
|
|
132
|
-
let fkm;
|
|
133
|
-
while ((fkm = tableFkRe.exec(tableSym.source)) !== null) {
|
|
134
|
-
const fromCol = fkm[1] ?? fkm[2] ?? fkm[3] ?? fkm[4] ?? "";
|
|
135
|
-
const toTable = fkm[9] ?? fkm[10] ?? fkm[11] ?? fkm[12] ?? "";
|
|
136
|
-
const toCol = fkm[13] ?? fkm[14] ?? fkm[15] ?? fkm[16] ?? "id";
|
|
137
|
-
// Avoid duplicates (column-level already caught this FK)
|
|
138
|
-
if (relationships.some((r) => r.from_table === table.name && r.from_column === fromCol && r.to_table === toTable))
|
|
139
|
-
continue;
|
|
140
|
-
relationships.push({
|
|
141
|
-
from_table: table.name,
|
|
142
|
-
from_column: fromCol,
|
|
143
|
-
to_table: toTable,
|
|
144
|
-
to_column: toCol,
|
|
145
|
-
type: toTable === table.name ? "self_reference" : "fk",
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
// Detect circular references
|
|
151
|
-
detectCircularRefs(relationships, warnings);
|
|
152
|
-
// Resolve dialect: explicit > auto-detect from concatenated table sources.
|
|
153
|
-
// Concatenation is bounded by tableSymbols (already filtered by file_pattern),
|
|
154
|
-
// so the cost stays linear in the analyzed schema.
|
|
155
|
-
let detected_dialect;
|
|
156
|
-
const explicit = options?.dialect;
|
|
157
|
-
if (explicit && explicit !== "auto") {
|
|
158
|
-
detected_dialect = explicit;
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
let probe = "";
|
|
162
|
-
for (const sym of tableSymbols) {
|
|
163
|
-
if (sym.source)
|
|
164
|
-
probe += sym.source + "\n";
|
|
165
|
-
if (probe.length > 32_000)
|
|
166
|
-
break; // 32 KB cap — enough fingerprint surface
|
|
167
|
-
}
|
|
168
|
-
detected_dialect = detectSqlDialect(probe);
|
|
169
|
-
}
|
|
170
|
-
const result = {
|
|
171
|
-
tables,
|
|
172
|
-
views,
|
|
173
|
-
relationships,
|
|
174
|
-
warnings,
|
|
175
|
-
detected_dialect,
|
|
176
|
-
};
|
|
177
|
-
if (options?.output_format === "mermaid") {
|
|
178
|
-
result.mermaid = generateMermaid(tables, relationships);
|
|
179
|
-
}
|
|
180
|
-
return result;
|
|
181
|
-
}
|
|
182
|
-
function detectCircularRefs(relationships, warnings) {
|
|
183
|
-
// Build adjacency map
|
|
184
|
-
const adj = new Map();
|
|
185
|
-
for (const rel of relationships) {
|
|
186
|
-
if (rel.type === "self_reference")
|
|
187
|
-
continue;
|
|
188
|
-
if (!adj.has(rel.from_table))
|
|
189
|
-
adj.set(rel.from_table, new Set());
|
|
190
|
-
adj.get(rel.from_table).add(rel.to_table);
|
|
191
|
-
}
|
|
192
|
-
// DFS cycle detection with visited set
|
|
193
|
-
const visited = new Set();
|
|
194
|
-
const inStack = new Set();
|
|
195
|
-
function dfs(node) {
|
|
196
|
-
if (inStack.has(node)) {
|
|
197
|
-
warnings.push(`Circular FK reference detected involving "${node}".`);
|
|
198
|
-
return;
|
|
199
|
-
}
|
|
200
|
-
if (visited.has(node))
|
|
201
|
-
return;
|
|
202
|
-
visited.add(node);
|
|
203
|
-
inStack.add(node);
|
|
204
|
-
for (const neighbor of adj.get(node) ?? []) {
|
|
205
|
-
dfs(neighbor);
|
|
206
|
-
}
|
|
207
|
-
inStack.delete(node);
|
|
208
|
-
}
|
|
209
|
-
for (const node of adj.keys()) {
|
|
210
|
-
dfs(node);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* Sanitize a name for Mermaid erDiagram entities.
|
|
215
|
-
* Strips leading non-word chars (e.g. Joomla's `#__`), keeps the rest readable.
|
|
216
|
-
* If the name becomes empty, returns "anon".
|
|
217
|
-
*/
|
|
218
|
-
function mermaidSafeName(name) {
|
|
219
|
-
// Strip leading non-word chars, replace remaining non-word with _
|
|
220
|
-
const cleaned = name
|
|
221
|
-
.replace(/^[^a-zA-Z0-9]+/, "") // strip leading #, $, @, etc.
|
|
222
|
-
.replace(/[^a-zA-Z0-9_]/g, "_");
|
|
223
|
-
return cleaned || "anon";
|
|
224
|
-
}
|
|
225
|
-
/** Sanitize a column type for Mermaid — keep the base type name only (drop size/precision). */
|
|
226
|
-
function mermaidSafeType(type) {
|
|
227
|
-
// "int(10) unsigned" → "int", "varchar(255)" → "varchar", "DECIMAL(10,2)" → "decimal"
|
|
228
|
-
const m = /^[a-zA-Z][a-zA-Z0-9_]*/.exec(type);
|
|
229
|
-
return m ? m[0].toLowerCase() : "unknown";
|
|
230
|
-
}
|
|
231
|
-
function generateMermaid(tables, relationships) {
|
|
232
|
-
const lines = ["erDiagram"];
|
|
233
|
-
for (const table of tables) {
|
|
234
|
-
const safeName = mermaidSafeName(table.name);
|
|
235
|
-
lines.push(` ${safeName} {`);
|
|
236
|
-
for (const col of table.columns) {
|
|
237
|
-
const typeName = mermaidSafeType(col.type);
|
|
238
|
-
lines.push(` ${typeName} ${mermaidSafeName(col.name)}`);
|
|
239
|
-
}
|
|
240
|
-
lines.push(" }");
|
|
241
|
-
}
|
|
242
|
-
for (const rel of relationships) {
|
|
243
|
-
const arrow = rel.type === "self_reference" ? "||--o|" : "||--o{";
|
|
244
|
-
lines.push(` ${mermaidSafeName(rel.from_table)} ${arrow} ${mermaidSafeName(rel.to_table)} : "${mermaidSafeName(rel.from_column)}"`);
|
|
245
|
-
}
|
|
246
|
-
return lines.join("\n");
|
|
247
|
-
}
|
|
248
|
-
export async function traceQuery(repo, options) {
|
|
249
|
-
if (!options.table?.trim()) {
|
|
250
|
-
throw new Error("table parameter is required");
|
|
251
|
-
}
|
|
252
|
-
const index = await getCodeIndex(repo);
|
|
253
|
-
if (!index) {
|
|
254
|
-
throw new Error(`Repository "${repo}" not found. Run index_folder first.`);
|
|
255
|
-
}
|
|
256
|
-
const tableName = options.table.trim();
|
|
257
|
-
const maxRefs = options.max_references ?? 500;
|
|
258
|
-
const includeOrm = options.include_orm ?? true;
|
|
259
|
-
// Find table definition
|
|
260
|
-
const tableSym = index.symbols.find((s) => (s.kind === "table" || s.kind === "view") && s.name === tableName);
|
|
261
|
-
const table_definition = tableSym
|
|
262
|
-
? { file: tableSym.file, line: tableSym.start_line, kind: tableSym.kind }
|
|
263
|
-
: null;
|
|
264
|
-
// Delegate to ripgrep-backed searchText for the fast literal scan, then
|
|
265
|
-
// post-filter in JS with an identifier-char boundary regex. Ripgrep doesn't
|
|
266
|
-
// support JS-style lookbehind, and \b fails on names starting with # or $.
|
|
267
|
-
const IDENT_CHAR = "[a-zA-Z0-9_#$@]";
|
|
268
|
-
const escaped = escapeRegex(tableName);
|
|
269
|
-
const boundaryRegex = new RegExp(`(?<!${IDENT_CHAR})${escaped}(?!${IDENT_CHAR})`, "i");
|
|
270
|
-
// Fetch a wider window so post-filter losses don't silently cap results.
|
|
271
|
-
const rgMatches = await searchText(repo, tableName, {
|
|
272
|
-
regex: false,
|
|
273
|
-
max_results: Math.max(maxRefs * 3, 500),
|
|
274
|
-
file_pattern: options.file_pattern,
|
|
275
|
-
context_lines: 0,
|
|
276
|
-
});
|
|
277
|
-
const sql_references = [];
|
|
278
|
-
let kept = 0;
|
|
279
|
-
let truncated = false;
|
|
280
|
-
for (const m of rgMatches) {
|
|
281
|
-
const text = m.content ?? "";
|
|
282
|
-
if (!boundaryRegex.test(text))
|
|
283
|
-
continue;
|
|
284
|
-
// Skip the definition line itself
|
|
285
|
-
if (tableSym && m.file === tableSym.file && m.line === tableSym.start_line)
|
|
286
|
-
continue;
|
|
287
|
-
sql_references.push({
|
|
288
|
-
file: m.file,
|
|
289
|
-
line: m.line,
|
|
290
|
-
context: text.trim().slice(0, 120),
|
|
291
|
-
type: classifyReference(text),
|
|
292
|
-
});
|
|
293
|
-
kept++;
|
|
294
|
-
if (kept >= maxRefs) {
|
|
295
|
-
truncated = true;
|
|
296
|
-
break;
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
const warnings = [];
|
|
300
|
-
if (truncated) {
|
|
301
|
-
warnings.push(`Results truncated at max_references=${maxRefs}. Pass file_pattern or increase max_references to see more.`);
|
|
302
|
-
}
|
|
303
|
-
// ORM detection
|
|
304
|
-
const orm_references = [];
|
|
305
|
-
if (includeOrm) {
|
|
306
|
-
// Prisma detection
|
|
307
|
-
const prismaFiles = index.files.filter((f) => f.path.endsWith(".prisma"));
|
|
308
|
-
for (const pf of prismaFiles) {
|
|
309
|
-
const prismaSymbols = index.symbols.filter((s) => s.file === pf.path);
|
|
310
|
-
for (const sym of prismaSymbols) {
|
|
311
|
-
// Check @@map("tableName") in source
|
|
312
|
-
if (sym.source?.includes(`@@map("${tableName}")`)) {
|
|
313
|
-
orm_references.push({
|
|
314
|
-
file: sym.file,
|
|
315
|
-
line: sym.start_line,
|
|
316
|
-
orm: "prisma",
|
|
317
|
-
model_name: sym.name,
|
|
318
|
-
});
|
|
319
|
-
}
|
|
320
|
-
// Check model name matching table name (case-insensitive)
|
|
321
|
-
if (sym.kind === "class" && sym.name.toLowerCase() === tableName.toLowerCase()) {
|
|
322
|
-
// Avoid duplicates
|
|
323
|
-
if (!orm_references.some((r) => r.file === sym.file && r.model_name === sym.name)) {
|
|
324
|
-
orm_references.push({
|
|
325
|
-
file: sym.file,
|
|
326
|
-
line: sym.start_line,
|
|
327
|
-
orm: "prisma",
|
|
328
|
-
model_name: sym.name,
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
// Drizzle detection
|
|
335
|
-
const tsFiles = index.files.filter((f) => f.path.endsWith(".ts") || f.path.endsWith(".js"));
|
|
336
|
-
for (const tf of tsFiles) {
|
|
337
|
-
const tsSymbols = index.symbols.filter((s) => s.file === tf.path && s.source);
|
|
338
|
-
for (const sym of tsSymbols) {
|
|
339
|
-
if (sym.source?.includes(`pgTable("${tableName}"`) ||
|
|
340
|
-
sym.source?.includes(`mysqlTable("${tableName}"`) ||
|
|
341
|
-
sym.source?.includes(`sqliteTable("${tableName}"`)) {
|
|
342
|
-
orm_references.push({
|
|
343
|
-
file: sym.file,
|
|
344
|
-
line: sym.start_line,
|
|
345
|
-
orm: "drizzle",
|
|
346
|
-
model_name: sym.name,
|
|
347
|
-
});
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
// Warn if ORM detected but no references found
|
|
352
|
-
if (prismaFiles.length > 0 && orm_references.length === 0) {
|
|
353
|
-
warnings.push(`ORM detected (Prisma) but no model found for table "${tableName}".`);
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
if (!table_definition && sql_references.length === 0) {
|
|
357
|
-
warnings.push(`Table "${tableName}" not found in indexed SQL files. If SQL support was disabled, this is expected.`);
|
|
358
|
-
}
|
|
359
|
-
return { table_definition, sql_references, orm_references, warnings, truncated };
|
|
360
|
-
}
|
|
361
|
-
function classifyReference(line) {
|
|
362
|
-
const upper = line.toUpperCase().trim();
|
|
363
|
-
if (/^\s*ALTER\s+TABLE/i.test(upper))
|
|
364
|
-
return "ddl";
|
|
365
|
-
if (/^\s*CREATE\s+(?:OR\s+REPLACE\s+)?(?:MATERIALIZED\s+)?VIEW/i.test(upper))
|
|
366
|
-
return "view";
|
|
367
|
-
if (/REFERENCES/i.test(upper))
|
|
368
|
-
return "fk";
|
|
369
|
-
if (/^\s*(?:SELECT|INSERT|UPDATE|DELETE)\b/i.test(upper))
|
|
370
|
-
return "dml";
|
|
371
|
-
return "dml";
|
|
372
|
-
}
|
|
373
|
-
function escapeRegex(str) {
|
|
374
|
-
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
375
|
-
}
|
|
376
|
-
export async function searchColumns(repo, options) {
|
|
377
|
-
const index = await getCodeIndex(repo);
|
|
378
|
-
if (!index) {
|
|
379
|
-
throw new Error(`Repository "${repo}" not found. Run index_folder first.`);
|
|
380
|
-
}
|
|
381
|
-
const queryLower = (options.query ?? "").toLowerCase();
|
|
382
|
-
const typeFilter = options.type?.toLowerCase();
|
|
383
|
-
const tableFilter = options.table?.toLowerCase();
|
|
384
|
-
const filePattern = options.file_pattern;
|
|
385
|
-
const maxResults = options.max_results ?? 100;
|
|
386
|
-
// Build table-id → table-name lookup (only SQL tables, not Prisma models)
|
|
387
|
-
const tableIdToName = new Map();
|
|
388
|
-
for (const sym of index.symbols) {
|
|
389
|
-
if (sym.kind !== "table")
|
|
390
|
-
continue;
|
|
391
|
-
if (filePattern && !sym.file.includes(filePattern))
|
|
392
|
-
continue;
|
|
393
|
-
tableIdToName.set(sym.id, { name: sym.name, file: sym.file });
|
|
394
|
-
}
|
|
395
|
-
// Collect field symbols whose parent is a SQL table
|
|
396
|
-
const allHits = [];
|
|
397
|
-
for (const sym of index.symbols) {
|
|
398
|
-
if (sym.kind !== "field")
|
|
399
|
-
continue;
|
|
400
|
-
if (!sym.parent)
|
|
401
|
-
continue;
|
|
402
|
-
const parent = tableIdToName.get(sym.parent);
|
|
403
|
-
if (!parent)
|
|
404
|
-
continue;
|
|
405
|
-
const name = sym.name;
|
|
406
|
-
const type = sym.signature ?? "unknown";
|
|
407
|
-
const normalized = normalizeType(type);
|
|
408
|
-
// Apply filters
|
|
409
|
-
if (queryLower && !name.toLowerCase().includes(queryLower))
|
|
410
|
-
continue;
|
|
411
|
-
if (typeFilter && normalized !== typeFilter)
|
|
412
|
-
continue;
|
|
413
|
-
if (tableFilter && !parent.name.toLowerCase().includes(tableFilter))
|
|
414
|
-
continue;
|
|
415
|
-
allHits.push({
|
|
416
|
-
name,
|
|
417
|
-
type,
|
|
418
|
-
normalized_type: normalized,
|
|
419
|
-
table: parent.name,
|
|
420
|
-
file: parent.file,
|
|
421
|
-
line: sym.start_line,
|
|
422
|
-
});
|
|
423
|
-
}
|
|
424
|
-
const total = allHits.length;
|
|
425
|
-
const truncated = total > maxResults;
|
|
426
|
-
const columns = truncated ? allHits.slice(0, maxResults) : allHits;
|
|
427
|
-
return { columns, total, truncated };
|
|
428
|
-
}
|
|
429
|
-
/**
|
|
430
|
-
* Per-table complexity score: column count + FK count + index count.
|
|
431
|
-
* Identifies "god tables" that need refactoring. Sorted by score desc.
|
|
432
|
-
*/
|
|
433
|
-
export async function analyzeSchemaComplexity(repo, options) {
|
|
434
|
-
const index = await getCodeIndex(repo);
|
|
435
|
-
if (!index) {
|
|
436
|
-
throw new Error(`Repository "${repo}" not found. Run index_folder first.`);
|
|
437
|
-
}
|
|
438
|
-
const filePattern = options?.file_pattern;
|
|
439
|
-
const topN = options?.top_n ?? 50;
|
|
440
|
-
const tables = index.symbols.filter((s) => {
|
|
441
|
-
if (s.kind !== "table")
|
|
442
|
-
return false;
|
|
443
|
-
if (filePattern && !s.file.includes(filePattern))
|
|
444
|
-
return false;
|
|
445
|
-
return true;
|
|
446
|
-
});
|
|
447
|
-
// Pre-compute: index count per table name
|
|
448
|
-
const indexCounts = new Map();
|
|
449
|
-
for (const sym of index.symbols) {
|
|
450
|
-
if (sym.kind !== "index")
|
|
451
|
-
continue;
|
|
452
|
-
// Index source typically contains "ON table_name(...)"
|
|
453
|
-
const onMatch = /\bON\s+(?:`([^`]+)`|"([^"]+)"|\[([^\]]+)\]|(\w+))/i.exec(sym.source ?? "");
|
|
454
|
-
if (onMatch) {
|
|
455
|
-
const tableName = (onMatch[1] ?? onMatch[2] ?? onMatch[3] ?? onMatch[4] ?? "").toLowerCase();
|
|
456
|
-
indexCounts.set(tableName, (indexCounts.get(tableName) ?? 0) + 1);
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
const results = [];
|
|
460
|
-
for (const table of tables) {
|
|
461
|
-
const columns = index.symbols.filter((s) => s.kind === "field" && s.parent === table.id);
|
|
462
|
-
const column_count = columns.length;
|
|
463
|
-
// Count FK references in columns
|
|
464
|
-
let fk_count = 0;
|
|
465
|
-
for (const col of columns) {
|
|
466
|
-
if (/REFERENCES/i.test(col.signature ?? ""))
|
|
467
|
-
fk_count++;
|
|
468
|
-
}
|
|
469
|
-
const index_count = indexCounts.get(table.name.toLowerCase()) ?? 0;
|
|
470
|
-
// Weighted score: columns dominate, FKs and indexes add coupling signal
|
|
471
|
-
const score = column_count * 1.0 + fk_count * 3.0 + index_count * 1.5;
|
|
472
|
-
results.push({
|
|
473
|
-
name: table.name,
|
|
474
|
-
file: table.file,
|
|
475
|
-
line: table.start_line,
|
|
476
|
-
column_count,
|
|
477
|
-
fk_count,
|
|
478
|
-
index_count,
|
|
479
|
-
score,
|
|
480
|
-
});
|
|
481
|
-
}
|
|
482
|
-
results.sort((a, b) => b.score - a.score);
|
|
483
|
-
return { tables: results.slice(0, topN) };
|
|
484
|
-
}
|
|
485
|
-
/**
|
|
486
|
-
* Scan codebase for unsafe DML patterns in SQL strings.
|
|
487
|
-
* Uses ripgrep to find DML statements, then classifies safety.
|
|
488
|
-
*/
|
|
489
|
-
export async function scanDmlSafety(repo, options) {
|
|
490
|
-
const index = await getCodeIndex(repo);
|
|
491
|
-
if (!index) {
|
|
492
|
-
throw new Error(`Repository "${repo}" not found. Run index_folder first.`);
|
|
493
|
-
}
|
|
494
|
-
const filePattern = options?.file_pattern;
|
|
495
|
-
const maxResults = options?.max_results ?? 200;
|
|
496
|
-
const findings = [];
|
|
497
|
-
const filesScanned = new Set();
|
|
498
|
-
// Pattern 1: DELETE without WHERE
|
|
499
|
-
const delMatches = await searchText(repo, "DELETE FROM", {
|
|
500
|
-
regex: false,
|
|
501
|
-
max_results: maxResults,
|
|
502
|
-
file_pattern: filePattern,
|
|
503
|
-
context_lines: 0,
|
|
504
|
-
});
|
|
505
|
-
for (const m of delMatches) {
|
|
506
|
-
filesScanned.add(m.file);
|
|
507
|
-
const text = m.content ?? "";
|
|
508
|
-
// Check if WHERE exists after DELETE FROM on the same line or nearby
|
|
509
|
-
if (!/\bWHERE\b/i.test(text)) {
|
|
510
|
-
findings.push({
|
|
511
|
-
rule: "delete-without-where",
|
|
512
|
-
severity: "high",
|
|
513
|
-
file: m.file,
|
|
514
|
-
line: m.line,
|
|
515
|
-
context: text.trim().slice(0, 120),
|
|
516
|
-
detail: `DELETE FROM without WHERE clause — may delete all rows.`,
|
|
517
|
-
});
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
// Pattern 2: UPDATE without WHERE
|
|
521
|
-
const updMatches = await searchText(repo, "UPDATE", {
|
|
522
|
-
regex: false,
|
|
523
|
-
max_results: maxResults,
|
|
524
|
-
file_pattern: filePattern,
|
|
525
|
-
context_lines: 0,
|
|
526
|
-
});
|
|
527
|
-
for (const m of updMatches) {
|
|
528
|
-
filesScanned.add(m.file);
|
|
529
|
-
const text = m.content ?? "";
|
|
530
|
-
// Must contain SET (otherwise it's not a DML UPDATE)
|
|
531
|
-
if (!/\bSET\b/i.test(text))
|
|
532
|
-
continue;
|
|
533
|
-
if (!/\bWHERE\b/i.test(text)) {
|
|
534
|
-
findings.push({
|
|
535
|
-
rule: "update-without-where",
|
|
536
|
-
severity: "high",
|
|
537
|
-
file: m.file,
|
|
538
|
-
line: m.line,
|
|
539
|
-
context: text.trim().slice(0, 120),
|
|
540
|
-
detail: `UPDATE...SET without WHERE clause — may update all rows.`,
|
|
541
|
-
});
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
// Pattern 3: SELECT * (unbounded read)
|
|
545
|
-
const selMatches = await searchText(repo, "SELECT *", {
|
|
546
|
-
regex: false,
|
|
547
|
-
max_results: maxResults,
|
|
548
|
-
file_pattern: filePattern,
|
|
549
|
-
context_lines: 0,
|
|
550
|
-
});
|
|
551
|
-
for (const m of selMatches) {
|
|
552
|
-
filesScanned.add(m.file);
|
|
553
|
-
const text = m.content ?? "";
|
|
554
|
-
// Only flag if FROM is present (actual query, not comment/string fragment)
|
|
555
|
-
if (!/\bFROM\b/i.test(text))
|
|
556
|
-
continue;
|
|
557
|
-
findings.push({
|
|
558
|
-
rule: "select-star",
|
|
559
|
-
severity: "info",
|
|
560
|
-
file: m.file,
|
|
561
|
-
line: m.line,
|
|
562
|
-
context: text.trim().slice(0, 120),
|
|
563
|
-
detail: `SELECT * — fetches all columns. Consider listing specific fields.`,
|
|
564
|
-
});
|
|
565
|
-
}
|
|
566
|
-
// Deduplicate: same file:line + same rule
|
|
567
|
-
const seen = new Set();
|
|
568
|
-
const deduped = findings.filter((f) => {
|
|
569
|
-
const key = `${f.file}:${f.line}:${f.rule}`;
|
|
570
|
-
if (seen.has(key))
|
|
571
|
-
return false;
|
|
572
|
-
seen.add(key);
|
|
573
|
-
return true;
|
|
574
|
-
});
|
|
575
|
-
const by_rule = {};
|
|
576
|
-
for (const f of deduped) {
|
|
577
|
-
by_rule[f.rule] = (by_rule[f.rule] ?? 0) + 1;
|
|
578
|
-
}
|
|
579
|
-
return {
|
|
580
|
-
findings: deduped,
|
|
581
|
-
summary: { total: deduped.length, by_rule, files_scanned: filesScanned.size },
|
|
582
|
-
};
|
|
583
|
-
}
|
|
584
|
-
/**
|
|
585
|
-
* Lint SQL schema for common anti-patterns.
|
|
586
|
-
* Conservative ruleset with near-zero false positive rate:
|
|
587
|
-
* - no-primary-key: table without PRIMARY KEY (serious design smell)
|
|
588
|
-
* - wide-table: table with >20 columns (god table)
|
|
589
|
-
* - duplicate-index-name: same index name defined multiple times
|
|
590
|
-
*/
|
|
591
|
-
export async function lintSchema(repo, options) {
|
|
592
|
-
const index = await getCodeIndex(repo);
|
|
593
|
-
if (!index) {
|
|
594
|
-
throw new Error(`Repository "${repo}" not found. Run index_folder first.`);
|
|
595
|
-
}
|
|
596
|
-
const filePattern = options?.file_pattern;
|
|
597
|
-
const findings = [];
|
|
598
|
-
const warnings = [];
|
|
599
|
-
const tables = index.symbols.filter((s) => {
|
|
600
|
-
if (s.kind !== "table")
|
|
601
|
-
return false;
|
|
602
|
-
if (filePattern && !s.file.includes(filePattern))
|
|
603
|
-
return false;
|
|
604
|
-
return true;
|
|
605
|
-
});
|
|
606
|
-
if (tables.length === 0) {
|
|
607
|
-
warnings.push("No SQL tables found in this repository.");
|
|
608
|
-
return { findings, summary: { total: 0, by_rule: {} }, warnings };
|
|
609
|
-
}
|
|
610
|
-
// Rule 1: no-primary-key — table with no PK field
|
|
611
|
-
for (const table of tables) {
|
|
612
|
-
const source = table.source ?? "";
|
|
613
|
-
const hasPK = /PRIMARY\s+KEY/i.test(source) || /\bSERIAL\b/i.test(source);
|
|
614
|
-
if (!hasPK) {
|
|
615
|
-
findings.push({
|
|
616
|
-
rule: "no-primary-key",
|
|
617
|
-
severity: "warning",
|
|
618
|
-
table: table.name,
|
|
619
|
-
detail: `Table "${table.name}" has no PRIMARY KEY or SERIAL column.`,
|
|
620
|
-
file: table.file,
|
|
621
|
-
line: table.start_line,
|
|
622
|
-
});
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
// Rule 2: wide-table — >20 columns
|
|
626
|
-
for (const table of tables) {
|
|
627
|
-
const fields = index.symbols.filter((s) => s.kind === "field" && s.parent === table.id);
|
|
628
|
-
if (fields.length > 20) {
|
|
629
|
-
findings.push({
|
|
630
|
-
rule: "wide-table",
|
|
631
|
-
severity: "warning",
|
|
632
|
-
table: table.name,
|
|
633
|
-
detail: `Table "${table.name}" has ${fields.length} columns (threshold: 20). Consider splitting.`,
|
|
634
|
-
file: table.file,
|
|
635
|
-
line: table.start_line,
|
|
636
|
-
});
|
|
637
|
-
}
|
|
638
|
-
}
|
|
639
|
-
// Rule 3: duplicate-index-name
|
|
640
|
-
const indexNames = new Map();
|
|
641
|
-
const indexes = index.symbols.filter((s) => {
|
|
642
|
-
if (s.kind !== "index")
|
|
643
|
-
return false;
|
|
644
|
-
if (filePattern && !s.file.includes(filePattern))
|
|
645
|
-
return false;
|
|
646
|
-
return true;
|
|
647
|
-
});
|
|
648
|
-
for (const idx of indexes) {
|
|
649
|
-
const key = idx.name.toLowerCase();
|
|
650
|
-
if (indexNames.has(key)) {
|
|
651
|
-
const prev = indexNames.get(key);
|
|
652
|
-
findings.push({
|
|
653
|
-
rule: "duplicate-index-name",
|
|
654
|
-
severity: "warning",
|
|
655
|
-
table: idx.name,
|
|
656
|
-
detail: `Index "${idx.name}" defined at ${idx.file}:${idx.start_line} duplicates index at ${prev.file}:${prev.line}.`,
|
|
657
|
-
file: idx.file,
|
|
658
|
-
line: idx.start_line,
|
|
659
|
-
});
|
|
660
|
-
}
|
|
661
|
-
else {
|
|
662
|
-
indexNames.set(key, { file: idx.file, line: idx.start_line });
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
// Build summary
|
|
666
|
-
const by_rule = {};
|
|
667
|
-
for (const f of findings) {
|
|
668
|
-
by_rule[f.rule] = (by_rule[f.rule] ?? 0) + 1;
|
|
669
|
-
}
|
|
670
|
-
return {
|
|
671
|
-
findings,
|
|
672
|
-
summary: { total: findings.length, by_rule },
|
|
673
|
-
warnings,
|
|
674
|
-
};
|
|
675
|
-
}
|
|
676
|
-
const MIGRATION_PATTERNS = [
|
|
677
|
-
// Destructive (high severity)
|
|
678
|
-
{ regex: /DROP\s+TABLE\s+(?:IF\s+EXISTS\s+)?(?:`([^`]+)`|"([^"]+)"|\[([^\]]+)\]|(\w+))/i, operation: "DROP TABLE", category: "destructive", severity: "high", targetGroup: 1 },
|
|
679
|
-
{ regex: /ALTER\s+TABLE\s+(?:`([^`]+)`|"([^"]+)"|\[([^\]]+)\]|(\w+))\s+DROP\s+COLUMN\s+(?:IF\s+EXISTS\s+)?(?:`([^`]+)`|"([^"]+)"|\[([^\]]+)\]|(\w+))/i, operation: "DROP COLUMN", category: "destructive", severity: "high", targetGroup: 1 },
|
|
680
|
-
{ regex: /DROP\s+INDEX\s+(?:IF\s+EXISTS\s+)?(?:`([^`]+)`|"([^"]+)"|\[([^\]]+)\]|(\w+))/i, operation: "DROP INDEX", category: "destructive", severity: "medium", targetGroup: 1 },
|
|
681
|
-
{ regex: /ALTER\s+TABLE\s+(?:`([^`]+)`|"([^"]+)"|\[([^\]]+)\]|(\w+))\s+DROP\s+CONSTRAINT/i, operation: "DROP CONSTRAINT", category: "destructive", severity: "medium", targetGroup: 1 },
|
|
682
|
-
{ regex: /TRUNCATE\s+(?:TABLE\s+)?(?:`([^`]+)`|"([^"]+)"|\[([^\]]+)\]|(\w+))/i, operation: "TRUNCATE", category: "destructive", severity: "high", targetGroup: 1 },
|
|
683
|
-
// Modifying (medium severity)
|
|
684
|
-
{ regex: /ALTER\s+TABLE\s+(?:`([^`]+)`|"([^"]+)"|\[([^\]]+)\]|(\w+))\s+ADD\s+COLUMN/i, operation: "ADD COLUMN", category: "modifying", severity: "low", targetGroup: 1 },
|
|
685
|
-
{ regex: /ALTER\s+TABLE\s+(?:`([^`]+)`|"([^"]+)"|\[([^\]]+)\]|(\w+))\s+ADD\s+(?!COLUMN)/i, operation: "ALTER TABLE ADD", category: "modifying", severity: "low", targetGroup: 1 },
|
|
686
|
-
{ regex: /ALTER\s+TABLE\s+(?:`([^`]+)`|"([^"]+)"|\[([^\]]+)\]|(\w+))\s+ALTER\s+COLUMN/i, operation: "ALTER COLUMN", category: "modifying", severity: "medium", targetGroup: 1 },
|
|
687
|
-
{ regex: /ALTER\s+TABLE\s+(?:`([^`]+)`|"([^"]+)"|\[([^\]]+)\]|(\w+))\s+RENAME/i, operation: "RENAME", category: "modifying", severity: "medium", targetGroup: 1 },
|
|
688
|
-
// Additive (low severity) — these overlap with the extractor's DDL patterns
|
|
689
|
-
{ regex: /CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?(?:`([^`]+)`|"([^"]+)"|\[([^\]]+)\]|(\w+))/i, operation: "CREATE TABLE", category: "additive", severity: "low", targetGroup: 1 },
|
|
690
|
-
{ regex: /CREATE\s+(?:UNIQUE\s+)?INDEX\s+(?:IF\s+NOT\s+EXISTS\s+)?(?:`([^`]+)`|"([^"]+)"|\[([^\]]+)\]|(\w+))/i, operation: "CREATE INDEX", category: "additive", severity: "low", targetGroup: 1 },
|
|
691
|
-
{ regex: /CREATE\s+(?:OR\s+REPLACE\s+)?(?:MATERIALIZED\s+)?VIEW\s+(?:`([^`]+)`|"([^"]+)"|\[([^\]]+)\]|(\w+))/i, operation: "CREATE VIEW", category: "additive", severity: "low", targetGroup: 1 },
|
|
692
|
-
];
|
|
693
|
-
function pickTarget(m, startGroup) {
|
|
694
|
-
for (let i = startGroup; i < m.length; i++) {
|
|
695
|
-
if (m[i])
|
|
696
|
-
return m[i];
|
|
697
|
-
}
|
|
698
|
-
return "(unknown)";
|
|
699
|
-
}
|
|
700
|
-
export async function diffMigrations(repo, options) {
|
|
701
|
-
const index = await getCodeIndex(repo);
|
|
702
|
-
if (!index) {
|
|
703
|
-
throw new Error(`Repository "${repo}" not found. Run index_folder first.`);
|
|
704
|
-
}
|
|
705
|
-
const filePattern = options?.file_pattern;
|
|
706
|
-
// Find .sql files, sorted by name (migration order heuristic)
|
|
707
|
-
const sqlFiles = index.files
|
|
708
|
-
.filter((f) => (f.language === "sql" || f.language === "sql-jinja"))
|
|
709
|
-
.filter((f) => !filePattern || f.path.includes(filePattern))
|
|
710
|
-
.sort((a, b) => a.path.localeCompare(b.path));
|
|
711
|
-
const additive = [];
|
|
712
|
-
const modifying = [];
|
|
713
|
-
const destructive = [];
|
|
714
|
-
for (const fileEntry of sqlFiles) {
|
|
715
|
-
// Read file source from symbols (each symbol has source)
|
|
716
|
-
// Or reconstruct from all symbols in this file
|
|
717
|
-
const fileSymbols = index.symbols.filter((s) => s.file === fileEntry.path);
|
|
718
|
-
// Collect all raw source lines we can access
|
|
719
|
-
const seenLines = new Set();
|
|
720
|
-
for (const sym of fileSymbols) {
|
|
721
|
-
if (!sym.source)
|
|
722
|
-
continue;
|
|
723
|
-
for (const line of sym.source.split("\n")) {
|
|
724
|
-
seenLines.add(line);
|
|
725
|
-
}
|
|
726
|
-
}
|
|
727
|
-
// Also scan the file directly for DML patterns not captured as symbols
|
|
728
|
-
// (ALTER, DROP, TRUNCATE aren't symbols — they're imperative ops)
|
|
729
|
-
let fullSource;
|
|
730
|
-
try {
|
|
731
|
-
const { readFileSync } = await import("node:fs");
|
|
732
|
-
const { join } = await import("node:path");
|
|
733
|
-
fullSource = readFileSync(join(index.root, fileEntry.path), "utf-8");
|
|
734
|
-
}
|
|
735
|
-
catch {
|
|
736
|
-
// File not accessible — use symbol sources only
|
|
737
|
-
}
|
|
738
|
-
const linesToScan = fullSource
|
|
739
|
-
? fullSource.split("\n")
|
|
740
|
-
: [...seenLines];
|
|
741
|
-
for (let lineIdx = 0; lineIdx < linesToScan.length; lineIdx++) {
|
|
742
|
-
const line = linesToScan[lineIdx];
|
|
743
|
-
const trimmed = line.trim();
|
|
744
|
-
if (!trimmed || trimmed.startsWith("--"))
|
|
745
|
-
continue;
|
|
746
|
-
for (const pat of MIGRATION_PATTERNS) {
|
|
747
|
-
const m = pat.regex.exec(trimmed);
|
|
748
|
-
if (!m)
|
|
749
|
-
continue;
|
|
750
|
-
const target = pickTarget(m, pat.targetGroup);
|
|
751
|
-
// For DROP COLUMN, include table.column
|
|
752
|
-
let fullTarget = target;
|
|
753
|
-
if (pat.operation === "DROP COLUMN") {
|
|
754
|
-
const colName = pickTarget(m, 5); // groups 5-8 are the column name
|
|
755
|
-
fullTarget = `${target}.${colName}`;
|
|
756
|
-
}
|
|
757
|
-
const op = {
|
|
758
|
-
operation: pat.operation,
|
|
759
|
-
target: fullTarget,
|
|
760
|
-
severity: pat.severity,
|
|
761
|
-
file: fileEntry.path,
|
|
762
|
-
line: lineIdx + 1,
|
|
763
|
-
raw: trimmed.slice(0, 120),
|
|
764
|
-
};
|
|
765
|
-
switch (pat.category) {
|
|
766
|
-
case "additive":
|
|
767
|
-
additive.push(op);
|
|
768
|
-
break;
|
|
769
|
-
case "modifying":
|
|
770
|
-
modifying.push(op);
|
|
771
|
-
break;
|
|
772
|
-
case "destructive":
|
|
773
|
-
destructive.push(op);
|
|
774
|
-
break;
|
|
775
|
-
}
|
|
776
|
-
break; // first match wins per line
|
|
777
|
-
}
|
|
778
|
-
}
|
|
779
|
-
}
|
|
780
|
-
return {
|
|
781
|
-
additive,
|
|
782
|
-
modifying,
|
|
783
|
-
destructive,
|
|
784
|
-
summary: {
|
|
785
|
-
additive: additive.length,
|
|
786
|
-
modifying: modifying.length,
|
|
787
|
-
destructive: destructive.length,
|
|
788
|
-
total_files: sqlFiles.length,
|
|
789
|
-
},
|
|
790
|
-
};
|
|
791
|
-
}
|
|
792
|
-
/**
|
|
793
|
-
* Find SQL tables with zero references outside their own CREATE TABLE definition.
|
|
794
|
-
* Uses ripgrep-backed literal search per table for speed.
|
|
795
|
-
*/
|
|
796
|
-
export async function findOrphanTables(repo, options) {
|
|
797
|
-
const index = await getCodeIndex(repo);
|
|
798
|
-
if (!index) {
|
|
799
|
-
throw new Error(`Repository "${repo}" not found. Run index_folder first.`);
|
|
800
|
-
}
|
|
801
|
-
const filePattern = options?.file_pattern;
|
|
802
|
-
// Collect all SQL tables
|
|
803
|
-
const tables = index.symbols.filter((s) => {
|
|
804
|
-
if (s.kind !== "table")
|
|
805
|
-
return false;
|
|
806
|
-
if (filePattern && !s.file.includes(filePattern))
|
|
807
|
-
return false;
|
|
808
|
-
return true;
|
|
809
|
-
});
|
|
810
|
-
const orphans = [];
|
|
811
|
-
for (const table of tables) {
|
|
812
|
-
// Search for references to this table name via ripgrep
|
|
813
|
-
let rgMatches = [];
|
|
814
|
-
try {
|
|
815
|
-
rgMatches = await searchText(repo, table.name, {
|
|
816
|
-
regex: false,
|
|
817
|
-
max_results: 20,
|
|
818
|
-
context_lines: 0,
|
|
819
|
-
});
|
|
820
|
-
}
|
|
821
|
-
catch {
|
|
822
|
-
rgMatches = [];
|
|
823
|
-
}
|
|
824
|
-
// Boundary filter + exclude the definition line itself
|
|
825
|
-
const IDENT_CHAR = "[a-zA-Z0-9_#$@]";
|
|
826
|
-
const escaped = escapeRegex(table.name);
|
|
827
|
-
const boundaryRegex = new RegExp(`(?<!${IDENT_CHAR})${escaped}(?!${IDENT_CHAR})`, "i");
|
|
828
|
-
const realRefs = rgMatches.filter((m) => {
|
|
829
|
-
const text = m.content ?? "";
|
|
830
|
-
if (!boundaryRegex.test(text))
|
|
831
|
-
return false;
|
|
832
|
-
// Exclude the CREATE TABLE definition line
|
|
833
|
-
if (m.file === table.file && m.line === table.start_line)
|
|
834
|
-
return false;
|
|
835
|
-
// Exclude lines within the CREATE TABLE body (column defs, constraints)
|
|
836
|
-
if (m.file === table.file && m.line > table.start_line && m.line <= table.end_line)
|
|
837
|
-
return false;
|
|
838
|
-
return true;
|
|
839
|
-
});
|
|
840
|
-
if (realRefs.length === 0) {
|
|
841
|
-
const columnCount = index.symbols.filter((s) => s.kind === "field" && s.parent === table.id).length;
|
|
842
|
-
orphans.push({
|
|
843
|
-
name: table.name,
|
|
844
|
-
file: table.file,
|
|
845
|
-
line: table.start_line,
|
|
846
|
-
column_count: columnCount,
|
|
847
|
-
});
|
|
848
|
-
}
|
|
849
|
-
}
|
|
850
|
-
return {
|
|
851
|
-
orphans,
|
|
852
|
-
total_tables: tables.length,
|
|
853
|
-
orphan_count: orphans.length,
|
|
854
|
-
};
|
|
855
|
-
}
|
|
856
|
-
/** Parse a Prisma model block source → fields + @@map table name */
|
|
857
|
-
function parsePrismaModel(sym) {
|
|
858
|
-
const source = sym.source ?? "";
|
|
859
|
-
const lines = source.split("\n");
|
|
860
|
-
const fields = [];
|
|
861
|
-
let tableName = camelToSnake(sym.name);
|
|
862
|
-
// @@map("table_name")
|
|
863
|
-
const mapMatch = /@@map\s*\(\s*"([^"]+)"\s*\)/.exec(source);
|
|
864
|
-
if (mapMatch)
|
|
865
|
-
tableName = mapMatch[1];
|
|
866
|
-
// Field line pattern: ` fieldName Type? @attr @attr`
|
|
867
|
-
const FIELD_RE = /^\s*(\w+)\s+(\w+)(\[\])?(\?)?\s*(.*)$/;
|
|
868
|
-
const RELATION_RE = /@relation/;
|
|
869
|
-
const MAP_ATTR_RE = /@map\s*\(\s*"([^"]+)"\s*\)/;
|
|
870
|
-
// Prisma scalar types — anything else with an uppercase first letter is a model relation
|
|
871
|
-
const SCALAR_TYPES = new Set([
|
|
872
|
-
"Int", "BigInt", "Float", "Decimal", "String", "Boolean", "DateTime", "Json", "Bytes", "Unsupported",
|
|
873
|
-
]);
|
|
874
|
-
for (const line of lines) {
|
|
875
|
-
const trimmed = line.trim();
|
|
876
|
-
// Skip model header, closing brace, comments, attributes
|
|
877
|
-
if (trimmed.startsWith("model ") || trimmed === "" || trimmed === "}")
|
|
878
|
-
continue;
|
|
879
|
-
if (trimmed.startsWith("//") || trimmed.startsWith("@@"))
|
|
880
|
-
continue;
|
|
881
|
-
const m = FIELD_RE.exec(trimmed);
|
|
882
|
-
if (!m)
|
|
883
|
-
continue;
|
|
884
|
-
const name = m[1];
|
|
885
|
-
const type = m[2];
|
|
886
|
-
const isList = m[3] === "[]";
|
|
887
|
-
const optional = m[4] === "?";
|
|
888
|
-
const attrs = m[5] ?? "";
|
|
889
|
-
// Skip reserved keywords that aren't fields (e.g. "model", "enum")
|
|
890
|
-
if (/^(model|enum|type|view)$/.test(name))
|
|
891
|
-
continue;
|
|
892
|
-
const is_id = /@id\b/.test(attrs);
|
|
893
|
-
// A field is a relation if:
|
|
894
|
-
// 1. It has @relation attr, OR
|
|
895
|
-
// 2. It's a list (Type[]) — always a relation side, OR
|
|
896
|
-
// 3. Its type starts with uppercase AND isn't a built-in scalar (→ custom model)
|
|
897
|
-
const is_relation = RELATION_RE.test(attrs) ||
|
|
898
|
-
isList ||
|
|
899
|
-
(/^[A-Z]/.test(type) && !SCALAR_TYPES.has(type));
|
|
900
|
-
// Relations aren't real DB columns — skip for drift purposes
|
|
901
|
-
if (is_relation)
|
|
902
|
-
continue;
|
|
903
|
-
// @map("db_col") overrides the db name
|
|
904
|
-
const mapField = MAP_ATTR_RE.exec(attrs);
|
|
905
|
-
const db_name = mapField ? mapField[1] : camelToSnake(name);
|
|
906
|
-
fields.push({ name, db_name, type, optional, is_id, is_relation });
|
|
907
|
-
}
|
|
908
|
-
return {
|
|
909
|
-
name: sym.name,
|
|
910
|
-
table: tableName,
|
|
911
|
-
file: sym.file,
|
|
912
|
-
line: sym.start_line,
|
|
913
|
-
fields,
|
|
914
|
-
};
|
|
915
|
-
}
|
|
916
|
-
function camelToSnake(s) {
|
|
917
|
-
return s
|
|
918
|
-
.replace(/([A-Z])/g, (_, c) => "_" + c.toLowerCase())
|
|
919
|
-
.replace(/^_/, "");
|
|
920
|
-
}
|
|
921
|
-
/**
|
|
922
|
-
* Normalize a type name for cross-layer comparison.
|
|
923
|
-
* Prisma Int → int, SQL INTEGER → int, Float → float, etc.
|
|
2
|
+
* SQL analysis tools public barrel.
|
|
924
3
|
*
|
|
925
|
-
*
|
|
926
|
-
*
|
|
927
|
-
*/
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
if (/^(bool|boolean|bit)$/.test(firstWord))
|
|
940
|
-
return "bool";
|
|
941
|
-
if (/^(timestamp|timestamptz|datetime|date|time|timetz)$/.test(firstWord))
|
|
942
|
-
return "datetime";
|
|
943
|
-
if (/^(json|jsonb)$/.test(firstWord))
|
|
944
|
-
return "json";
|
|
945
|
-
if (/^(uuid)$/.test(firstWord))
|
|
946
|
-
return "uuid";
|
|
947
|
-
if (/^(bytea|blob|binary|longblob|mediumblob|tinyblob)$/.test(firstWord))
|
|
948
|
-
return "bytes";
|
|
949
|
-
return firstWord || "unknown";
|
|
950
|
-
}
|
|
951
|
-
export async function analyzeSchemaDrift(repo, options) {
|
|
952
|
-
const index = await getCodeIndex(repo);
|
|
953
|
-
if (!index) {
|
|
954
|
-
throw new Error(`Repository "${repo}" not found. Run index_folder first.`);
|
|
955
|
-
}
|
|
956
|
-
const filePattern = options?.file_pattern;
|
|
957
|
-
const drifts = [];
|
|
958
|
-
const warnings = [];
|
|
959
|
-
const orms_detected = [];
|
|
960
|
-
// Collect SQL tables and fields
|
|
961
|
-
const sqlTables = new Map();
|
|
962
|
-
for (const sym of index.symbols) {
|
|
963
|
-
if (sym.kind !== "table")
|
|
964
|
-
continue;
|
|
965
|
-
if (filePattern && !sym.file.includes(filePattern))
|
|
966
|
-
continue;
|
|
967
|
-
const columns = new Map();
|
|
968
|
-
const fields = index.symbols.filter((f) => f.kind === "field" && f.parent === sym.id);
|
|
969
|
-
for (const f of fields) {
|
|
970
|
-
columns.set(f.name.toLowerCase(), {
|
|
971
|
-
type: f.signature ?? "unknown",
|
|
972
|
-
file: f.file,
|
|
973
|
-
line: f.start_line,
|
|
974
|
-
});
|
|
975
|
-
}
|
|
976
|
-
sqlTables.set(sym.name.toLowerCase(), {
|
|
977
|
-
file: sym.file,
|
|
978
|
-
line: sym.start_line,
|
|
979
|
-
columns,
|
|
980
|
-
});
|
|
981
|
-
}
|
|
982
|
-
// Collect Prisma models (kind === "class" in prisma extractor)
|
|
983
|
-
const prismaModels = [];
|
|
984
|
-
for (const sym of index.symbols) {
|
|
985
|
-
if (sym.kind !== "class")
|
|
986
|
-
continue;
|
|
987
|
-
if (!sym.file.endsWith(".prisma"))
|
|
988
|
-
continue;
|
|
989
|
-
if (filePattern && !sym.file.includes(filePattern))
|
|
990
|
-
continue;
|
|
991
|
-
prismaModels.push(parsePrismaModel(sym));
|
|
992
|
-
}
|
|
993
|
-
if (prismaModels.length > 0)
|
|
994
|
-
orms_detected.push("prisma");
|
|
995
|
-
// TODO: Drizzle and TypeORM collection (v1.2)
|
|
996
|
-
if (orms_detected.length === 0) {
|
|
997
|
-
warnings.push("No ORM models found in repository. analyze_schema_drift requires at least one ORM (Prisma/Drizzle/TypeORM).");
|
|
998
|
-
return {
|
|
999
|
-
drifts: [],
|
|
1000
|
-
summary: { extra_in_orm: 0, extra_in_sql: 0, type_mismatches: 0, total: 0 },
|
|
1001
|
-
orms_detected,
|
|
1002
|
-
warnings,
|
|
1003
|
-
};
|
|
1004
|
-
}
|
|
1005
|
-
// Cross-reference: Prisma models vs SQL tables
|
|
1006
|
-
const matchedSqlTables = new Set();
|
|
1007
|
-
for (const model of prismaModels) {
|
|
1008
|
-
const sqlTable = sqlTables.get(model.table.toLowerCase());
|
|
1009
|
-
if (!sqlTable) {
|
|
1010
|
-
// Prisma model has no matching SQL table → extra_in_orm
|
|
1011
|
-
drifts.push({
|
|
1012
|
-
kind: "extra_in_orm",
|
|
1013
|
-
table: model.table,
|
|
1014
|
-
orm: "prisma",
|
|
1015
|
-
orm_file: model.file,
|
|
1016
|
-
orm_line: model.line,
|
|
1017
|
-
detail: `Prisma model "${model.name}" maps to table "${model.table}" which does not exist in SQL schema.`,
|
|
1018
|
-
});
|
|
1019
|
-
continue;
|
|
1020
|
-
}
|
|
1021
|
-
matchedSqlTables.add(model.table.toLowerCase());
|
|
1022
|
-
// Compare fields
|
|
1023
|
-
const sqlCols = sqlTable.columns;
|
|
1024
|
-
const matchedSqlCols = new Set();
|
|
1025
|
-
for (const field of model.fields) {
|
|
1026
|
-
const sqlCol = sqlCols.get(field.db_name.toLowerCase());
|
|
1027
|
-
if (!sqlCol) {
|
|
1028
|
-
drifts.push({
|
|
1029
|
-
kind: "extra_in_orm",
|
|
1030
|
-
table: model.table,
|
|
1031
|
-
column: field.name,
|
|
1032
|
-
orm: "prisma",
|
|
1033
|
-
orm_file: model.file,
|
|
1034
|
-
orm_line: model.line,
|
|
1035
|
-
orm_type: field.type,
|
|
1036
|
-
detail: `Prisma field "${model.name}.${field.name}" (maps to "${field.db_name}") does not exist in SQL table "${model.table}".`,
|
|
1037
|
-
});
|
|
1038
|
-
continue;
|
|
1039
|
-
}
|
|
1040
|
-
matchedSqlCols.add(field.db_name.toLowerCase());
|
|
1041
|
-
// Type compatibility check
|
|
1042
|
-
const ormNorm = normalizeType(field.type);
|
|
1043
|
-
const sqlNorm = normalizeType(sqlCol.type);
|
|
1044
|
-
if (ormNorm !== sqlNorm && ormNorm !== "unknown" && sqlNorm !== "unknown") {
|
|
1045
|
-
drifts.push({
|
|
1046
|
-
kind: "type_mismatch",
|
|
1047
|
-
table: model.table,
|
|
1048
|
-
column: field.name,
|
|
1049
|
-
orm: "prisma",
|
|
1050
|
-
orm_file: model.file,
|
|
1051
|
-
orm_line: model.line,
|
|
1052
|
-
sql_file: sqlCol.file,
|
|
1053
|
-
sql_line: sqlCol.line,
|
|
1054
|
-
orm_type: field.type,
|
|
1055
|
-
sql_type: sqlCol.type,
|
|
1056
|
-
detail: `Type mismatch: Prisma "${model.name}.${field.name}" is "${field.type}" (${ormNorm}) but SQL "${model.table}.${field.db_name}" is "${sqlCol.type}" (${sqlNorm}).`,
|
|
1057
|
-
});
|
|
1058
|
-
}
|
|
1059
|
-
}
|
|
1060
|
-
// SQL columns not covered by any Prisma field → extra_in_sql (column-level)
|
|
1061
|
-
for (const [colName, sqlCol] of sqlCols) {
|
|
1062
|
-
if (matchedSqlCols.has(colName))
|
|
1063
|
-
continue;
|
|
1064
|
-
// Don't flag common auto-columns that Prisma often omits
|
|
1065
|
-
if (/^(created_at|updated_at|deleted_at)$/i.test(colName))
|
|
1066
|
-
continue;
|
|
1067
|
-
drifts.push({
|
|
1068
|
-
kind: "extra_in_sql",
|
|
1069
|
-
table: model.table,
|
|
1070
|
-
column: colName,
|
|
1071
|
-
orm: "prisma",
|
|
1072
|
-
sql_file: sqlCol.file,
|
|
1073
|
-
sql_line: sqlCol.line,
|
|
1074
|
-
sql_type: sqlCol.type,
|
|
1075
|
-
detail: `SQL column "${model.table}.${colName}" has no corresponding field in Prisma model "${model.name}".`,
|
|
1076
|
-
});
|
|
1077
|
-
}
|
|
1078
|
-
}
|
|
1079
|
-
// SQL tables with no Prisma model → extra_in_sql (table-level)
|
|
1080
|
-
for (const [tableName, sqlTable] of sqlTables) {
|
|
1081
|
-
if (matchedSqlTables.has(tableName))
|
|
1082
|
-
continue;
|
|
1083
|
-
drifts.push({
|
|
1084
|
-
kind: "extra_in_sql",
|
|
1085
|
-
table: tableName,
|
|
1086
|
-
orm: "prisma",
|
|
1087
|
-
sql_file: sqlTable.file,
|
|
1088
|
-
sql_line: sqlTable.line,
|
|
1089
|
-
detail: `SQL table "${tableName}" has no corresponding Prisma model.`,
|
|
1090
|
-
});
|
|
1091
|
-
}
|
|
1092
|
-
const summary = {
|
|
1093
|
-
extra_in_orm: drifts.filter((d) => d.kind === "extra_in_orm").length,
|
|
1094
|
-
extra_in_sql: drifts.filter((d) => d.kind === "extra_in_sql").length,
|
|
1095
|
-
type_mismatches: drifts.filter((d) => d.kind === "type_mismatch").length,
|
|
1096
|
-
total: drifts.length,
|
|
1097
|
-
};
|
|
1098
|
-
// Heuristic warning: if >50% of ORM tables have no SQL counterpart, this is
|
|
1099
|
-
// likely a Prisma-migrate style project where SQL files are incremental
|
|
1100
|
-
// migrations, not a full schema snapshot. In that case table-level drift
|
|
1101
|
-
// is noise — the real signal is field-level drift on matched tables.
|
|
1102
|
-
const totalOrmTables = prismaModels.length;
|
|
1103
|
-
const orphanOrmTables = drifts.filter((d) => d.kind === "extra_in_orm" && !d.column).length;
|
|
1104
|
-
if (totalOrmTables > 0 && orphanOrmTables / totalOrmTables > 0.5) {
|
|
1105
|
-
warnings.push(`${orphanOrmTables}/${totalOrmTables} Prisma models have no SQL counterpart. ` +
|
|
1106
|
-
`This likely means the project uses Prisma Migrate (incremental migrations) ` +
|
|
1107
|
-
`rather than a full schema.sql snapshot. Field-level drifts on matched tables ` +
|
|
1108
|
-
`are still meaningful; ignore table-level extra_in_orm drifts in this mode.`);
|
|
1109
|
-
}
|
|
1110
|
-
return { drifts, summary, orms_detected, warnings };
|
|
1111
|
-
}
|
|
1112
|
-
const DEFAULT_SQL_AUDIT_CHECKS = ["drift", "orphan", "lint", "dml", "complexity"];
|
|
1113
|
-
/**
|
|
1114
|
-
* Composite SQL audit — runs multiple diagnostic gates in a single call.
|
|
1115
|
-
* Mirrors framework_audit / nest_audit / audit_scan pattern.
|
|
1116
|
-
*
|
|
1117
|
-
* Individual gate functions (analyzeSchemaDrift, findOrphanTables, lintSchema,
|
|
1118
|
-
* scanDmlSafety, analyzeSchemaComplexity) remain exported for internal use
|
|
1119
|
-
* but are NOT registered as separate MCP tools. sql_audit is the single
|
|
1120
|
-
* discoverable entry point.
|
|
1121
|
-
*/
|
|
1122
|
-
export async function sqlAudit(repo, options) {
|
|
1123
|
-
const checks = options?.checks ?? DEFAULT_SQL_AUDIT_CHECKS;
|
|
1124
|
-
const filePattern = options?.file_pattern;
|
|
1125
|
-
const gates = [];
|
|
1126
|
-
const warnings = [];
|
|
1127
|
-
// Build option objects with only defined fields (for exactOptionalPropertyTypes compat)
|
|
1128
|
-
const scopedOpts = {};
|
|
1129
|
-
if (filePattern !== undefined)
|
|
1130
|
-
scopedOpts.file_pattern = filePattern;
|
|
1131
|
-
// Gate 1: schema_drift (ORM ↔ SQL drift)
|
|
1132
|
-
if (checks.includes("drift")) {
|
|
1133
|
-
const drift = await analyzeSchemaDrift(repo, scopedOpts);
|
|
1134
|
-
const criticalCount = drift.summary.type_mismatches;
|
|
1135
|
-
gates.push({
|
|
1136
|
-
check: "drift",
|
|
1137
|
-
pass: drift.summary.total === 0,
|
|
1138
|
-
critical: criticalCount > 0,
|
|
1139
|
-
finding_count: drift.summary.total,
|
|
1140
|
-
data: drift,
|
|
1141
|
-
summary: drift.summary.total === 0
|
|
1142
|
-
? "No schema drift detected"
|
|
1143
|
-
: `${drift.summary.total} drift${drift.summary.total === 1 ? "" : "s"}: ${drift.summary.extra_in_orm} extra in ORM, ${drift.summary.extra_in_sql} extra in SQL, ${drift.summary.type_mismatches} type mismatches`,
|
|
1144
|
-
});
|
|
1145
|
-
for (const w of drift.warnings)
|
|
1146
|
-
warnings.push(`drift: ${w}`);
|
|
1147
|
-
}
|
|
1148
|
-
// Gate 2: orphan_tables
|
|
1149
|
-
if (checks.includes("orphan")) {
|
|
1150
|
-
const orphan = await findOrphanTables(repo, scopedOpts);
|
|
1151
|
-
gates.push({
|
|
1152
|
-
check: "orphan",
|
|
1153
|
-
pass: orphan.orphan_count === 0,
|
|
1154
|
-
critical: false,
|
|
1155
|
-
finding_count: orphan.orphan_count,
|
|
1156
|
-
data: orphan,
|
|
1157
|
-
summary: orphan.orphan_count === 0
|
|
1158
|
-
? `No orphan tables (${orphan.total_tables} tables scanned)`
|
|
1159
|
-
: `${orphan.orphan_count}/${orphan.total_tables} tables with zero references`,
|
|
1160
|
-
});
|
|
1161
|
-
}
|
|
1162
|
-
// Gate 3: lint_schema
|
|
1163
|
-
if (checks.includes("lint")) {
|
|
1164
|
-
const lint = await lintSchema(repo, scopedOpts);
|
|
1165
|
-
gates.push({
|
|
1166
|
-
check: "lint",
|
|
1167
|
-
pass: lint.summary.total === 0,
|
|
1168
|
-
critical: false,
|
|
1169
|
-
finding_count: lint.summary.total,
|
|
1170
|
-
data: lint,
|
|
1171
|
-
summary: lint.summary.total === 0
|
|
1172
|
-
? "No schema lint violations"
|
|
1173
|
-
: `${lint.summary.total} lint violation${lint.summary.total === 1 ? "" : "s"}: ${Object.entries(lint.summary.by_rule).map(([r, n]) => `${r}=${n}`).join(", ")}`,
|
|
1174
|
-
});
|
|
1175
|
-
for (const w of lint.warnings)
|
|
1176
|
-
warnings.push(`lint: ${w}`);
|
|
1177
|
-
}
|
|
1178
|
-
// Gate 4: dml_safety
|
|
1179
|
-
if (checks.includes("dml")) {
|
|
1180
|
-
const dmlOpts = {};
|
|
1181
|
-
if (filePattern !== undefined)
|
|
1182
|
-
dmlOpts.file_pattern = filePattern;
|
|
1183
|
-
if (options?.max_results !== undefined)
|
|
1184
|
-
dmlOpts.max_results = options.max_results;
|
|
1185
|
-
const dml = await scanDmlSafety(repo, dmlOpts);
|
|
1186
|
-
const highSeverity = dml.findings.filter((f) => f.severity === "high").length;
|
|
1187
|
-
gates.push({
|
|
1188
|
-
check: "dml",
|
|
1189
|
-
pass: highSeverity === 0,
|
|
1190
|
-
critical: highSeverity > 0,
|
|
1191
|
-
finding_count: dml.summary.total,
|
|
1192
|
-
data: dml,
|
|
1193
|
-
summary: dml.summary.total === 0
|
|
1194
|
-
? `No DML safety issues (${dml.summary.files_scanned} files scanned)`
|
|
1195
|
-
: `${dml.summary.total} DML issue${dml.summary.total === 1 ? "" : "s"} (${highSeverity} high risk): ${Object.entries(dml.summary.by_rule).map(([r, n]) => `${r}=${n}`).join(", ")}`,
|
|
1196
|
-
});
|
|
1197
|
-
}
|
|
1198
|
-
// Gate 5: schema_complexity (god tables)
|
|
1199
|
-
if (checks.includes("complexity")) {
|
|
1200
|
-
const complexityOpts = { top_n: 10 };
|
|
1201
|
-
if (filePattern !== undefined)
|
|
1202
|
-
complexityOpts.file_pattern = filePattern;
|
|
1203
|
-
const complexity = await analyzeSchemaComplexity(repo, complexityOpts);
|
|
1204
|
-
// Threshold: score >= 25 = "needs refactor" (20 cols + 1 FK + 1 idx → 24.5)
|
|
1205
|
-
const godTables = complexity.tables.filter((t) => t.score >= 25);
|
|
1206
|
-
gates.push({
|
|
1207
|
-
check: "complexity",
|
|
1208
|
-
pass: godTables.length === 0,
|
|
1209
|
-
critical: false,
|
|
1210
|
-
finding_count: godTables.length,
|
|
1211
|
-
data: complexity,
|
|
1212
|
-
summary: godTables.length === 0
|
|
1213
|
-
? `No god tables detected (${complexity.tables.length} tables analyzed)`
|
|
1214
|
-
: `${godTables.length} god table${godTables.length === 1 ? "" : "s"}: ${godTables.slice(0, 3).map((t) => `${t.name}(${t.score.toFixed(0)})`).join(", ")}${godTables.length > 3 ? "..." : ""}`,
|
|
1215
|
-
});
|
|
1216
|
-
}
|
|
1217
|
-
const total_findings = gates.reduce((sum, g) => sum + g.finding_count, 0);
|
|
1218
|
-
const critical_findings = gates
|
|
1219
|
-
.filter((g) => g.critical)
|
|
1220
|
-
.reduce((sum, g) => sum + g.finding_count, 0);
|
|
1221
|
-
const gates_passed = gates.filter((g) => g.pass).length;
|
|
1222
|
-
const gates_failed = gates.filter((g) => !g.pass).length;
|
|
1223
|
-
return {
|
|
1224
|
-
gates,
|
|
1225
|
-
summary: {
|
|
1226
|
-
total_findings,
|
|
1227
|
-
critical_findings,
|
|
1228
|
-
gates_run: gates.length,
|
|
1229
|
-
gates_passed,
|
|
1230
|
-
gates_failed,
|
|
1231
|
-
},
|
|
1232
|
-
warnings,
|
|
1233
|
-
};
|
|
1234
|
-
}
|
|
4
|
+
* Capability implementations live in focused sql-*-tools modules; this file
|
|
5
|
+
* preserves the existing import path used by MCP registration and tests.
|
|
6
|
+
*/
|
|
7
|
+
export { detectSqlDialect } from "./sql-shared-tools.js";
|
|
8
|
+
export { analyzeSchema } from "./sql-schema-tools.js";
|
|
9
|
+
export { traceQuery } from "./sql-query-tools.js";
|
|
10
|
+
export { searchColumns } from "./sql-column-tools.js";
|
|
11
|
+
export { analyzeSchemaComplexity } from "./sql-complexity-tools.js";
|
|
12
|
+
export { scanDmlSafety } from "./sql-dml-safety-tools.js";
|
|
13
|
+
export { lintSchema } from "./sql-lint-schema-tools.js";
|
|
14
|
+
export { diffMigrations } from "./sql-migration-diff-tools.js";
|
|
15
|
+
export { findOrphanTables } from "./sql-orphan-table-tools.js";
|
|
16
|
+
export { analyzeSchemaDrift } from "./sql-drift-tools.js";
|
|
17
|
+
export { sqlAudit } from "./sql-audit-tools.js";
|
|
1235
18
|
//# sourceMappingURL=sql-tools.js.map
|