codesift-mcp 0.9.5 → 0.9.10
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 +39 -23
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +88 -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/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 +53 -320
- package/dist/server-helpers.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +39 -0
- package/dist/server.js.map +1 -1
- package/dist/storage/usage-tracker.d.ts.map +1 -1
- package/dist/storage/usage-tracker.js +12 -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 +17 -383
- package/dist/tools/project-tools.d.ts.map +1 -1
- package/dist/tools/project-tools.js +35 -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/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/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
|
@@ -5,408 +5,34 @@
|
|
|
5
5
|
* framework-specific conventions. Produces a JSON profile conforming to
|
|
6
6
|
* the zuvo project-profile schema v1.0.
|
|
7
7
|
*/
|
|
8
|
-
import { readFile
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import { execFile } from "node:child_process";
|
|
12
|
-
import { promisify } from "node:util";
|
|
13
|
-
const execFileAsync = promisify(execFile);
|
|
14
|
-
import { getCodeIndex } from "./index-tools.js";
|
|
8
|
+
import { readFile } from "node:fs/promises";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import { EXTRACTOR_VERSIONS } from "./index-shared.js";
|
|
15
11
|
import { extractAstroConventions } from "./astro-config.js";
|
|
12
|
+
import { extractDependencyGraph, extractDependencyHealth, extractGitHealth, extractIdentity, extractKnownGotchas, extractTestConventions, } from "./project-profile-extractors.js";
|
|
13
|
+
import { readJson } from "./project-profile-fs.js";
|
|
14
|
+
import { buildImporterCount, buildImporterCountFromSources } from "./project-profile-imports.js";
|
|
15
|
+
import { writeProfileToDisk } from "./project-profile-persistence.js";
|
|
16
|
+
import { buildSummary } from "./project-profile-summary.js";
|
|
17
|
+
import { detectStack } from "./project-profile-stack.js";
|
|
18
|
+
import { extractHonoConventions, getHonoFallbackCount } from "./project-profile-hono.js";
|
|
19
|
+
import { extractNestConventions, parseMiddlewareChains } from "./project-profile-nest.js";
|
|
20
|
+
import { extractNextConventions } from "./project-profile-next.js";
|
|
21
|
+
import { extractExpressConventions } from "./project-profile-express.js";
|
|
22
|
+
import { extractReactConventions } from "./project-profile-react.js";
|
|
23
|
+
import { extractPythonConventions } from "./project-profile-python.js";
|
|
24
|
+
import { extractPhpConventions, extractYii2Conventions } from "./project-profile-php.js";
|
|
16
25
|
// ---------------------------------------------------------------------------
|
|
17
26
|
// Versioning — used by get_extractor_versions
|
|
18
27
|
// ---------------------------------------------------------------------------
|
|
19
|
-
export
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
hono: "2.0.0",
|
|
23
|
-
nestjs: "1.0.0",
|
|
24
|
-
nextjs: "1.0.0",
|
|
25
|
-
express: "1.0.0",
|
|
26
|
-
react: "2.0.0", // Wave 1-4 + Tier 1-4: component/hook kinds, classifyReactKind, React class heritage — forces cache invalidation
|
|
27
|
-
typescript: "3.0.0", // v3: extends/implements heritage, generics in signatures, enum members as constants, is_async flag, modifiers + accessor_kind in meta, namespace + ambient module declarations, anonymous default export synth, RangeError guard, AST-based import-graph branch with type_only flag + tsconfig paths resolution + find_circular_deps type-only filter (was v2.1: field_definition, CommonJS exports, object-literal methods, class_static_block, generator_function_declaration)
|
|
28
|
-
javascript: "1.0.0", // independent JS version — bump for JS-only extractor changes (CJS, .jsx-specific) without forcing TS reindex
|
|
29
|
-
python: "1.0.0",
|
|
30
|
-
php: "2.0.0", // v2: extends/implements/uses_traits/modifiers/attributes on classes; typed properties + readonly + @var fallback on properties; promoted constructor params as synthetic field symbols; backed enum types; method-level modifiers + attributes; Codeception base classes (Unit/Cest/Cept) classify as test_suite — forces full reindex of PHP files
|
|
31
|
-
astro: "1.0.0",
|
|
32
|
-
kotlin: "1.0.0",
|
|
33
|
-
monorepo: "1.0.0", // workspace resolver — bump forces reindex when workspace schema changes
|
|
34
|
-
};
|
|
35
|
-
// ---------------------------------------------------------------------------
|
|
36
|
-
// Stack Detector
|
|
37
|
-
// ---------------------------------------------------------------------------
|
|
38
|
-
async function fileExists(path) {
|
|
39
|
-
try {
|
|
40
|
-
await access(path);
|
|
41
|
-
return true;
|
|
42
|
-
}
|
|
43
|
-
catch {
|
|
44
|
-
return false;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
async function readJson(path) {
|
|
48
|
-
try {
|
|
49
|
-
return JSON.parse(await readFile(path, "utf-8"));
|
|
50
|
-
}
|
|
51
|
-
catch {
|
|
52
|
-
return null;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
export async function detectStack(projectRoot) {
|
|
56
|
-
const detected_from = [];
|
|
57
|
-
const pkg = await readJson(join(projectRoot, "package.json"));
|
|
58
|
-
// Framework detection
|
|
59
|
-
let framework = null;
|
|
60
|
-
let framework_version = null;
|
|
61
|
-
if (pkg) {
|
|
62
|
-
const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
63
|
-
const frameworkMap = [
|
|
64
|
-
["hono", "hono"],
|
|
65
|
-
["@nestjs/core", "nestjs"],
|
|
66
|
-
["next", "nextjs"],
|
|
67
|
-
["nuxt", "nuxt"],
|
|
68
|
-
["@remix-run/node", "remix"],
|
|
69
|
-
["astro", "astro"],
|
|
70
|
-
["express", "express"],
|
|
71
|
-
["fastify", "fastify"],
|
|
72
|
-
["@angular/core", "angular"],
|
|
73
|
-
["vue", "vue"],
|
|
74
|
-
["svelte", "svelte"],
|
|
75
|
-
];
|
|
76
|
-
for (const [dep, name] of frameworkMap) {
|
|
77
|
-
if (allDeps?.[dep]) {
|
|
78
|
-
framework = name;
|
|
79
|
-
framework_version = allDeps[dep]?.replace(/^[\^~>=<]/, "") ?? null;
|
|
80
|
-
detected_from.push(`package.json:dependencies.${dep}`);
|
|
81
|
-
break;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
// React detection (only if no framework found — React is often a sub-dep)
|
|
85
|
-
if (!framework && allDeps?.["react"]) {
|
|
86
|
-
framework = "react";
|
|
87
|
-
framework_version = allDeps["react"]?.replace(/^[\^~>=<]/, "") ?? null;
|
|
88
|
-
detected_from.push("package.json:dependencies.react");
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
// Python framework detection (if no JS framework found)
|
|
92
|
-
if (!framework) {
|
|
93
|
-
const pyproject = await readJson(join(projectRoot, "pyproject.toml")) ?? null;
|
|
94
|
-
const requirements = await readFile(join(projectRoot, "requirements.txt"), "utf-8").catch(() => "");
|
|
95
|
-
const pipfile = await readFile(join(projectRoot, "Pipfile"), "utf-8").catch(() => "");
|
|
96
|
-
const pyDeps = requirements + pipfile + (pyproject ? JSON.stringify(pyproject) : "");
|
|
97
|
-
if (pyDeps.includes("fastapi")) {
|
|
98
|
-
framework = "fastapi";
|
|
99
|
-
detected_from.push("python:fastapi");
|
|
100
|
-
}
|
|
101
|
-
else if (pyDeps.includes("django")) {
|
|
102
|
-
framework = "django";
|
|
103
|
-
detected_from.push("python:django");
|
|
104
|
-
}
|
|
105
|
-
else if (pyDeps.includes("flask")) {
|
|
106
|
-
framework = "flask";
|
|
107
|
-
detected_from.push("python:flask");
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
// PHP framework detection
|
|
111
|
-
if (!framework) {
|
|
112
|
-
const composer = await readJson(join(projectRoot, "composer.json"));
|
|
113
|
-
if (composer) {
|
|
114
|
-
const phpDeps = { ...composer.require, ...composer["require-dev"] };
|
|
115
|
-
if (phpDeps?.["laravel/framework"]) {
|
|
116
|
-
framework = "laravel";
|
|
117
|
-
framework_version = phpDeps["laravel/framework"]?.replace(/^[\^~>=<]/, "") ?? null;
|
|
118
|
-
detected_from.push("composer.json:require.laravel/framework");
|
|
119
|
-
}
|
|
120
|
-
else if (phpDeps?.["yiisoft/yii2"]) {
|
|
121
|
-
framework = "yii2";
|
|
122
|
-
framework_version = phpDeps["yiisoft/yii2"]?.replace(/^[\^~>=<]/, "") ?? null;
|
|
123
|
-
detected_from.push("composer.json:require.yiisoft/yii2");
|
|
124
|
-
}
|
|
125
|
-
else if (phpDeps?.["symfony/framework-bundle"]) {
|
|
126
|
-
framework = "symfony";
|
|
127
|
-
detected_from.push("composer.json:require.symfony/framework-bundle");
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
// Language detection
|
|
132
|
-
let language = "javascript";
|
|
133
|
-
let language_version = null;
|
|
134
|
-
// Check for Python first
|
|
135
|
-
if (["fastapi", "django", "flask"].includes(framework ?? "")) {
|
|
136
|
-
language = "python";
|
|
137
|
-
detected_from.push("framework implies python");
|
|
138
|
-
}
|
|
139
|
-
else if (await fileExists(join(projectRoot, "pyproject.toml")) || await fileExists(join(projectRoot, "requirements.txt"))) {
|
|
140
|
-
language = "python";
|
|
141
|
-
detected_from.push("pyproject.toml or requirements.txt");
|
|
142
|
-
}
|
|
143
|
-
// Check for PHP
|
|
144
|
-
if (["laravel", "symfony", "yii2"].includes(framework ?? "")) {
|
|
145
|
-
language = "php";
|
|
146
|
-
detected_from.push("framework implies php");
|
|
147
|
-
}
|
|
148
|
-
// TypeScript/JavaScript (only if not already Python/PHP)
|
|
149
|
-
if (language === "javascript") {
|
|
150
|
-
const tsconfig = await readJson(join(projectRoot, "tsconfig.json"));
|
|
151
|
-
if (tsconfig) {
|
|
152
|
-
language = "typescript";
|
|
153
|
-
language_version = tsconfig?.compilerOptions?.target ?? null;
|
|
154
|
-
detected_from.push("tsconfig.json");
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
// Test runner detection
|
|
158
|
-
let test_runner = null;
|
|
159
|
-
if (language === "python") {
|
|
160
|
-
if (await fileExists(join(projectRoot, "pytest.ini")) || await fileExists(join(projectRoot, "conftest.py"))) {
|
|
161
|
-
test_runner = "pytest";
|
|
162
|
-
detected_from.push("pytest.ini or conftest.py");
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
else if (language === "php") {
|
|
166
|
-
if (await fileExists(join(projectRoot, "phpunit.xml")) || await fileExists(join(projectRoot, "phpunit.xml.dist"))) {
|
|
167
|
-
test_runner = "phpunit";
|
|
168
|
-
detected_from.push("phpunit.xml");
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
else if (pkg) {
|
|
172
|
-
const devDeps = pkg.devDependencies ?? {};
|
|
173
|
-
if (devDeps["vitest"]) {
|
|
174
|
-
test_runner = "vitest";
|
|
175
|
-
detected_from.push("package.json:devDependencies.vitest");
|
|
176
|
-
}
|
|
177
|
-
else if (devDeps["jest"]) {
|
|
178
|
-
test_runner = "jest";
|
|
179
|
-
detected_from.push("package.json:devDependencies.jest");
|
|
180
|
-
}
|
|
181
|
-
else if (devDeps["mocha"]) {
|
|
182
|
-
test_runner = "mocha";
|
|
183
|
-
detected_from.push("package.json:devDependencies.mocha");
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
// Package manager detection
|
|
187
|
-
let package_manager = null;
|
|
188
|
-
if (await fileExists(join(projectRoot, "pnpm-lock.yaml"))) {
|
|
189
|
-
package_manager = "pnpm";
|
|
190
|
-
detected_from.push("pnpm-lock.yaml");
|
|
191
|
-
}
|
|
192
|
-
else if (await fileExists(join(projectRoot, "yarn.lock"))) {
|
|
193
|
-
package_manager = "yarn";
|
|
194
|
-
detected_from.push("yarn.lock");
|
|
195
|
-
}
|
|
196
|
-
else if (await fileExists(join(projectRoot, "package-lock.json"))) {
|
|
197
|
-
package_manager = "npm";
|
|
198
|
-
detected_from.push("package-lock.json");
|
|
199
|
-
}
|
|
200
|
-
else if (await fileExists(join(projectRoot, "bun.lockb"))) {
|
|
201
|
-
package_manager = "bun";
|
|
202
|
-
detected_from.push("bun.lockb");
|
|
203
|
-
}
|
|
204
|
-
// Monorepo detection — resolveWorkspaces() (Task 4) is the primary path.
|
|
205
|
-
// Falls back to the legacy regex YAML parser when resolveWorkspaces returns
|
|
206
|
-
// null (covers @manypkg's edge cases such as malformed configs).
|
|
207
|
-
let monorepo = null;
|
|
208
|
-
// Read raw workspace globs from manifest first — they are the canonical
|
|
209
|
-
// shape exposed by `monorepo.workspaces` (string[] of patterns).
|
|
210
|
-
let manifestWorkspaces = null;
|
|
211
|
-
if (pkg?.workspaces) {
|
|
212
|
-
manifestWorkspaces = Array.isArray(pkg.workspaces)
|
|
213
|
-
? pkg.workspaces
|
|
214
|
-
: pkg.workspaces.packages ?? [];
|
|
215
|
-
detected_from.push("package.json:workspaces");
|
|
216
|
-
}
|
|
217
|
-
else if (await fileExists(join(projectRoot, "pnpm-workspace.yaml"))) {
|
|
218
|
-
try {
|
|
219
|
-
const content = await readFile(join(projectRoot, "pnpm-workspace.yaml"), "utf-8");
|
|
220
|
-
manifestWorkspaces =
|
|
221
|
-
content.match(/- ['"]?([^'"]+)['"]?/g)?.map((m) => m.replace(/- ['"]?/, "").replace(/['"]$/, "")) ?? [];
|
|
222
|
-
detected_from.push("pnpm-workspace.yaml");
|
|
223
|
-
}
|
|
224
|
-
catch {
|
|
225
|
-
/* ignore parse errors */
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
if (manifestWorkspaces) {
|
|
229
|
-
const turboExists = await fileExists(join(projectRoot, "turbo.json"));
|
|
230
|
-
const nxExists = await fileExists(join(projectRoot, "nx.json"));
|
|
231
|
-
const tool = turboExists
|
|
232
|
-
? "turborepo"
|
|
233
|
-
: nxExists
|
|
234
|
-
? "nx"
|
|
235
|
-
: pkg?.workspaces
|
|
236
|
-
? "workspaces"
|
|
237
|
-
: "pnpm-workspaces";
|
|
238
|
-
// Try the rich resolver (Task 4) — graceful degradation if it returns null
|
|
239
|
-
let workspace_details;
|
|
240
|
-
try {
|
|
241
|
-
const { resolveWorkspaces } = await import("../storage/workspace-resolver.js");
|
|
242
|
-
const resolved = await resolveWorkspaces(projectRoot);
|
|
243
|
-
if (resolved) {
|
|
244
|
-
workspace_details = resolved.workspaces;
|
|
245
|
-
detected_from.push("workspace-resolver");
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
catch {
|
|
249
|
-
/* fall back to manifest-only data — graceful */
|
|
250
|
-
}
|
|
251
|
-
monorepo = {
|
|
252
|
-
tool,
|
|
253
|
-
workspaces: manifestWorkspaces,
|
|
254
|
-
...(workspace_details ? { workspace_details } : {}),
|
|
255
|
-
};
|
|
256
|
-
}
|
|
257
|
-
// Monorepo workspace scanning — if root has no framework/test_runner, scan workspaces
|
|
258
|
-
if (monorepo && (!framework || !test_runner || language === "javascript")) {
|
|
259
|
-
const workspacePatterns = monorepo.workspaces;
|
|
260
|
-
const workspaceDirs = [];
|
|
261
|
-
for (const pattern of workspacePatterns) {
|
|
262
|
-
// Expand simple glob patterns like "apps/*" or "packages/*"
|
|
263
|
-
const base = pattern.replace(/\/?\*$/, "");
|
|
264
|
-
const baseDir = join(projectRoot, base);
|
|
265
|
-
try {
|
|
266
|
-
const entries = await readdir(baseDir, { withFileTypes: true });
|
|
267
|
-
for (const entry of entries) {
|
|
268
|
-
if (entry.isDirectory()) {
|
|
269
|
-
workspaceDirs.push(join(baseDir, entry.name));
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
catch { /* directory doesn't exist */ }
|
|
274
|
-
}
|
|
275
|
-
const frameworkMap = [
|
|
276
|
-
["hono", "hono"],
|
|
277
|
-
["@nestjs/core", "nestjs"],
|
|
278
|
-
["next", "nextjs"],
|
|
279
|
-
["nuxt", "nuxt"],
|
|
280
|
-
["@remix-run/node", "remix"],
|
|
281
|
-
["astro", "astro"],
|
|
282
|
-
["express", "express"],
|
|
283
|
-
["fastify", "fastify"],
|
|
284
|
-
];
|
|
285
|
-
for (const wsDir of workspaceDirs) {
|
|
286
|
-
const wsPkg = await readJson(join(wsDir, "package.json"));
|
|
287
|
-
if (!wsPkg)
|
|
288
|
-
continue;
|
|
289
|
-
const wsDeps = { ...wsPkg.dependencies, ...wsPkg.devDependencies };
|
|
290
|
-
const wsName = relative(projectRoot, wsDir);
|
|
291
|
-
// Framework from workspace (prefer backend frameworks: hono, nestjs, express)
|
|
292
|
-
if (!framework) {
|
|
293
|
-
for (const [dep, name] of frameworkMap) {
|
|
294
|
-
if (wsDeps?.[dep]) {
|
|
295
|
-
framework = name;
|
|
296
|
-
framework_version = wsDeps[dep]?.replace(/^[\^~>=<]/, "") ?? null;
|
|
297
|
-
detected_from.push(`${wsName}/package.json:dependencies.${dep}`);
|
|
298
|
-
break;
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
// Test runner from workspace
|
|
303
|
-
if (!test_runner) {
|
|
304
|
-
if (wsDeps?.["vitest"]) {
|
|
305
|
-
test_runner = "vitest";
|
|
306
|
-
detected_from.push(`${wsName}/package.json:devDependencies.vitest`);
|
|
307
|
-
}
|
|
308
|
-
else if (wsDeps?.["jest"]) {
|
|
309
|
-
test_runner = "jest";
|
|
310
|
-
detected_from.push(`${wsName}/package.json:devDependencies.jest`);
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
// TypeScript from workspace
|
|
314
|
-
if (language === "javascript") {
|
|
315
|
-
const wsTsconfig = await readJson(join(wsDir, "tsconfig.json"));
|
|
316
|
-
if (wsTsconfig) {
|
|
317
|
-
language = "typescript";
|
|
318
|
-
language_version = wsTsconfig?.compilerOptions?.target ?? null;
|
|
319
|
-
detected_from.push(`${wsName}/tsconfig.json`);
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
// Also check root tsconfig.base.json for monorepos that use base config
|
|
325
|
-
if (language === "javascript") {
|
|
326
|
-
const baseTsconfig = await readJson(join(projectRoot, "tsconfig.base.json"));
|
|
327
|
-
if (baseTsconfig) {
|
|
328
|
-
language = "typescript";
|
|
329
|
-
language_version = baseTsconfig?.compilerOptions?.target ?? null;
|
|
330
|
-
detected_from.push("tsconfig.base.json");
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
// Build tool detection (Vite, CRA, webpack, Parcel, esbuild, Rspack, Turbopack)
|
|
334
|
-
// Order matters: check more specific/modern tools first.
|
|
335
|
-
let build_tool = null;
|
|
336
|
-
if (pkg) {
|
|
337
|
-
const devDeps = pkg.devDependencies ?? {};
|
|
338
|
-
const deps = pkg.dependencies ?? {};
|
|
339
|
-
const allDeps = { ...deps, ...devDeps };
|
|
340
|
-
if (allDeps["vite"]) {
|
|
341
|
-
build_tool = "vite";
|
|
342
|
-
detected_from.push("package.json:vite");
|
|
343
|
-
}
|
|
344
|
-
else if (allDeps["react-scripts"]) {
|
|
345
|
-
build_tool = "cra";
|
|
346
|
-
detected_from.push("package.json:react-scripts");
|
|
347
|
-
}
|
|
348
|
-
else if (allDeps["@rsbuild/core"]) {
|
|
349
|
-
build_tool = "rsbuild";
|
|
350
|
-
detected_from.push("package.json:@rsbuild/core");
|
|
351
|
-
}
|
|
352
|
-
else if (allDeps["@rspack/cli"] || allDeps["@rspack/core"]) {
|
|
353
|
-
build_tool = "rspack";
|
|
354
|
-
detected_from.push("package.json:@rspack/*");
|
|
355
|
-
}
|
|
356
|
-
else if (allDeps["parcel"] || allDeps["parcel-bundler"]) {
|
|
357
|
-
build_tool = "parcel";
|
|
358
|
-
detected_from.push("package.json:parcel");
|
|
359
|
-
}
|
|
360
|
-
else if (allDeps["webpack"] || allDeps["webpack-cli"]) {
|
|
361
|
-
build_tool = "webpack";
|
|
362
|
-
detected_from.push("package.json:webpack");
|
|
363
|
-
}
|
|
364
|
-
else if (allDeps["esbuild"]) {
|
|
365
|
-
build_tool = "esbuild";
|
|
366
|
-
detected_from.push("package.json:esbuild");
|
|
367
|
-
}
|
|
368
|
-
else if (allDeps["turbopack"]) {
|
|
369
|
-
build_tool = "turbopack";
|
|
370
|
-
detected_from.push("package.json:turbopack");
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
// Fallback: look for config files if no dep match
|
|
374
|
-
if (!build_tool) {
|
|
375
|
-
const configChecks = [
|
|
376
|
-
["vite.config.ts", "vite"],
|
|
377
|
-
["vite.config.js", "vite"],
|
|
378
|
-
["vite.config.mjs", "vite"],
|
|
379
|
-
["webpack.config.js", "webpack"],
|
|
380
|
-
["webpack.config.ts", "webpack"],
|
|
381
|
-
["rspack.config.js", "rspack"],
|
|
382
|
-
["rsbuild.config.ts", "rsbuild"],
|
|
383
|
-
[".parcelrc", "parcel"],
|
|
384
|
-
];
|
|
385
|
-
for (const [file, tool] of configChecks) {
|
|
386
|
-
if (await fileExists(join(projectRoot, file))) {
|
|
387
|
-
build_tool = tool;
|
|
388
|
-
detected_from.push(file);
|
|
389
|
-
break;
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
return {
|
|
394
|
-
framework,
|
|
395
|
-
framework_version,
|
|
396
|
-
language,
|
|
397
|
-
language_version,
|
|
398
|
-
test_runner,
|
|
399
|
-
package_manager,
|
|
400
|
-
build_tool,
|
|
401
|
-
monorepo,
|
|
402
|
-
detected_from,
|
|
403
|
-
};
|
|
404
|
-
}
|
|
28
|
+
export { EXTRACTOR_VERSIONS } from "./index-shared.js";
|
|
29
|
+
export { buildConventionsSummary } from "./project-profile-summary.js";
|
|
30
|
+
export { detectStack, extractHonoConventions, getHonoFallbackCount, extractNestConventions, parseMiddlewareChains, extractNextConventions, extractExpressConventions, extractReactConventions, extractPythonConventions, extractPhpConventions, extractYii2Conventions, };
|
|
405
31
|
// ---------------------------------------------------------------------------
|
|
406
32
|
// File Classifier
|
|
407
33
|
// ---------------------------------------------------------------------------
|
|
408
34
|
const CRITICAL_PATH_PATTERNS = [
|
|
409
|
-
|
|
35
|
+
/(^|\/)(app|main|server)\.(ts|js|tsx|jsx)$/,
|
|
410
36
|
/\/middleware\//,
|
|
411
37
|
/\/security\//,
|
|
412
38
|
/\/auth\//,
|
|
@@ -414,7 +40,7 @@ const CRITICAL_PATH_PATTERNS = [
|
|
|
414
40
|
];
|
|
415
41
|
/** index.ts is critical ONLY at shallow depth (src/index.ts, apps/api/src/index.ts) — not barrel re-exports */
|
|
416
42
|
function isEntryPointIndex(path) {
|
|
417
|
-
if (
|
|
43
|
+
if (!/(^|\/)index\.(ts|js|tsx|jsx)$/.test(path))
|
|
418
44
|
return false;
|
|
419
45
|
// Count path depth — barrel files are deep (components/Foo/index.ts = 3+ segments after src)
|
|
420
46
|
const parts = path.split("/");
|
|
@@ -445,7 +71,7 @@ function isTestFile(path) {
|
|
|
445
71
|
return /\.(test|spec)\.(ts|js|tsx|jsx)$/.test(path);
|
|
446
72
|
}
|
|
447
73
|
function classifyCodeType(path, _symbol_count) {
|
|
448
|
-
if (
|
|
74
|
+
if (/(^|\/)(app|main|server)\.(ts|js)$/.test(path))
|
|
449
75
|
return "ORCHESTRATOR";
|
|
450
76
|
if (/\/middleware\//.test(path))
|
|
451
77
|
return "GUARD";
|
|
@@ -467,19 +93,11 @@ function classifyCodeType(path, _symbol_count) {
|
|
|
467
93
|
return "CONSTANT";
|
|
468
94
|
return "PURE";
|
|
469
95
|
}
|
|
470
|
-
export function classifyFiles(index) {
|
|
96
|
+
export function classifyFiles(index, importerCount = buildImporterCountFromSources(index)) {
|
|
471
97
|
const critical = [];
|
|
472
98
|
const important = [];
|
|
473
99
|
const routineCounts = {};
|
|
474
100
|
let routineCount = 0;
|
|
475
|
-
// Build importer count map
|
|
476
|
-
const importerCount = new Map();
|
|
477
|
-
for (const sym of index.symbols) {
|
|
478
|
-
// Count how many unique files import each file
|
|
479
|
-
if (sym.source?.includes("import ") || sym.source?.includes("require(")) {
|
|
480
|
-
// Simplified — in production this would use the actual import graph
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
101
|
// Build test file set for has_tests detection
|
|
484
102
|
const testFiles = new Set(index.files
|
|
485
103
|
.filter((f) => isTestFile(f.path))
|
|
@@ -543,1119 +161,21 @@ export function classifyFiles(index) {
|
|
|
543
161
|
routine: { count: routineCount, by_type: routineCounts },
|
|
544
162
|
};
|
|
545
163
|
}
|
|
546
|
-
// ---------------------------------------------------------------------------
|
|
547
|
-
// Hono Extractor
|
|
548
|
-
// ---------------------------------------------------------------------------
|
|
549
|
-
let _honoFallbackCount = 0;
|
|
550
|
-
export function getHonoFallbackCount() { return _honoFallbackCount; }
|
|
551
|
-
/**
|
|
552
|
-
* Extract Hono conventions from an orchestrator file.
|
|
553
|
-
*
|
|
554
|
-
* Uses the tree-sitter AST extractor (HonoExtractor) and adapts the result
|
|
555
|
-
* to the legacy Conventions shape. Falls back to the regex-based legacy
|
|
556
|
-
* implementation on failure (with counter tracking for observability).
|
|
557
|
-
*
|
|
558
|
-
* Kill switch: set CODESIFT_LEGACY_HONO=1 to force legacy extractor.
|
|
559
|
-
*/
|
|
560
|
-
export async function extractHonoConventions(source, filePath) {
|
|
561
|
-
if (process.env.CODESIFT_LEGACY_HONO === "1") {
|
|
562
|
-
const { legacyExtractHonoConventions } = await import("./legacy-hono-conventions.js");
|
|
563
|
-
return legacyExtractHonoConventions(source, filePath);
|
|
564
|
-
}
|
|
565
|
-
// If called with a source string and a file path that doesn't exist on disk,
|
|
566
|
-
// this is the legacy string-fixture API — use legacy extractor directly.
|
|
567
|
-
// The AST extractor needs a real file to parse.
|
|
568
|
-
const { existsSync } = await import("node:fs");
|
|
569
|
-
const { isAbsolute, resolve: pathResolve } = await import("node:path");
|
|
570
|
-
const resolved = isAbsolute(filePath) ? filePath : pathResolve(filePath);
|
|
571
|
-
if (!existsSync(resolved)) {
|
|
572
|
-
const { legacyExtractHonoConventions } = await import("./legacy-hono-conventions.js");
|
|
573
|
-
return legacyExtractHonoConventions(source, filePath);
|
|
574
|
-
}
|
|
575
|
-
try {
|
|
576
|
-
return await honoConventionsAdapter(resolved);
|
|
577
|
-
}
|
|
578
|
-
catch (err) {
|
|
579
|
-
_honoFallbackCount++;
|
|
580
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
581
|
-
console.warn(`[codesift] Hono AST extractor failed (fallback #${_honoFallbackCount}): ${msg}`);
|
|
582
|
-
if (process.env.NODE_ENV !== "production" && process.env.CODESIFT_SILENT_FALLBACK !== "1") {
|
|
583
|
-
throw err;
|
|
584
|
-
}
|
|
585
|
-
const { legacyExtractHonoConventions } = await import("./legacy-hono-conventions.js");
|
|
586
|
-
return legacyExtractHonoConventions(source, filePath);
|
|
587
|
-
}
|
|
588
|
-
}
|
|
589
|
-
/**
|
|
590
|
-
* Adapter: run HonoExtractor.parse() and map HonoAppModel → Conventions.
|
|
591
|
-
*/
|
|
592
|
-
async function honoConventionsAdapter(filePath) {
|
|
593
|
-
const { HonoExtractor } = await import("../parser/extractors/hono.js");
|
|
594
|
-
const extractor = new HonoExtractor();
|
|
595
|
-
const model = await extractor.parse(filePath);
|
|
596
|
-
// Map middleware_chains
|
|
597
|
-
const middleware_chains = model.middleware_chains.map((mc) => ({
|
|
598
|
-
scope: mc.scope === "*" ? "global" : mc.scope.replace(/\/\*$/, "").split("/").filter(Boolean)[1] ?? mc.scope,
|
|
599
|
-
file: mc.entries[0]?.file ?? filePath,
|
|
600
|
-
chain: mc.entries.map((e) => ({
|
|
601
|
-
name: e.name,
|
|
602
|
-
line: e.line,
|
|
603
|
-
order: e.order,
|
|
604
|
-
})),
|
|
605
|
-
}));
|
|
606
|
-
// Map route_mounts
|
|
607
|
-
const route_mounts = model.mounts
|
|
608
|
-
.filter((m) => m.mount_type === "hono_route")
|
|
609
|
-
.map((m) => ({
|
|
610
|
-
file: filePath,
|
|
611
|
-
line: 0, // line not tracked in new model at mount level
|
|
612
|
-
mount_path: m.mount_path,
|
|
613
|
-
imported_from: m.child_file || null,
|
|
614
|
-
exported_as: m.child_var,
|
|
615
|
-
}));
|
|
616
|
-
// Map auth_patterns from middleware names
|
|
617
|
-
const authGroups = {};
|
|
618
|
-
let auth_middleware = null;
|
|
619
|
-
for (const mc of model.middleware_chains) {
|
|
620
|
-
const scope = mc.scope === "*" ? "global" : mc.scope.replace(/\/\*$/, "").split("/").filter(Boolean)[1] ?? mc.scope;
|
|
621
|
-
for (const entry of mc.entries) {
|
|
622
|
-
if (/auth|clerk|jwt|session|passport/i.test(entry.name)) {
|
|
623
|
-
auth_middleware = entry.name;
|
|
624
|
-
if (!authGroups[scope])
|
|
625
|
-
authGroups[scope] = { requires_auth: false, middleware: [] };
|
|
626
|
-
authGroups[scope].requires_auth = true;
|
|
627
|
-
if (!authGroups[scope].middleware.includes(entry.name)) {
|
|
628
|
-
authGroups[scope].middleware.push(entry.name);
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
}
|
|
632
|
-
}
|
|
633
|
-
// Ensure all route groups represented
|
|
634
|
-
for (const mount of model.mounts) {
|
|
635
|
-
const group = mount.mount_path.split("/").filter(Boolean)[1] ?? "root";
|
|
636
|
-
if (!authGroups[group])
|
|
637
|
-
authGroups[group] = { requires_auth: false, middleware: [] };
|
|
638
|
-
}
|
|
639
|
-
return {
|
|
640
|
-
middleware_chains,
|
|
641
|
-
rate_limits: [], // rate limits extracted from AST in future; empty for now
|
|
642
|
-
route_mounts,
|
|
643
|
-
auth_patterns: { auth_middleware, groups: authGroups },
|
|
644
|
-
};
|
|
645
|
-
}
|
|
646
|
-
// ---------------------------------------------------------------------------
|
|
647
|
-
// NestJS Extractor
|
|
648
|
-
// ---------------------------------------------------------------------------
|
|
649
|
-
/** Count net `[` vs `]` on a line — positive means more open brackets. */
|
|
650
|
-
function countBracketBalance(text) {
|
|
651
|
-
let depth = 0;
|
|
652
|
-
for (const ch of text) {
|
|
653
|
-
if (ch === "[")
|
|
654
|
-
depth++;
|
|
655
|
-
else if (ch === "]")
|
|
656
|
-
depth--;
|
|
657
|
-
}
|
|
658
|
-
return depth;
|
|
659
|
-
}
|
|
660
|
-
export function extractNestConventions(source, filePath) {
|
|
661
|
-
const lines = source.split("\n");
|
|
662
|
-
// Build import map
|
|
663
|
-
const importMap = new Map();
|
|
664
|
-
for (const line of lines) {
|
|
665
|
-
const defaultImport = line.match(/import\s+\{([^}]+)\}\s+from\s+['"]([^'"]+)['"]/);
|
|
666
|
-
if (defaultImport) {
|
|
667
|
-
const names = defaultImport[1].split(",").map((n) => n.trim().split(/\s+as\s+/).pop().trim());
|
|
668
|
-
for (const name of names) {
|
|
669
|
-
importMap.set(name, defaultImport[2]);
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
}
|
|
673
|
-
const modules = [];
|
|
674
|
-
const global_guards = [];
|
|
675
|
-
const global_filters = [];
|
|
676
|
-
const global_pipes = [];
|
|
677
|
-
const global_interceptors = [];
|
|
678
|
-
const controllers = [];
|
|
679
|
-
let throttler = null;
|
|
680
|
-
let inImports = false;
|
|
681
|
-
let importsBracketDepth = 0;
|
|
682
|
-
let inProviders = false;
|
|
683
|
-
let providersBracketDepth = 0;
|
|
684
|
-
let inControllers = false;
|
|
685
|
-
let controllersBracketDepth = 0;
|
|
686
|
-
for (let i = 0; i < lines.length; i++) {
|
|
687
|
-
const line = lines[i];
|
|
688
|
-
const lineNum = i + 1;
|
|
689
|
-
// Track @Module sections via bracket depth — handles both multi-line arrays
|
|
690
|
-
// (imports: [\n A,\n B,\n]) and single-line arrays (imports: [A, B]).
|
|
691
|
-
// Critical: mark inImports BEFORE scanning the current line so the scan
|
|
692
|
-
// block runs on single-line `imports: [...]` arrays.
|
|
693
|
-
let closeInImportsAfterLine = false;
|
|
694
|
-
if (/imports:\s*\[/.test(line)) {
|
|
695
|
-
inImports = true;
|
|
696
|
-
importsBracketDepth += countBracketBalance(line.slice(line.indexOf("[")));
|
|
697
|
-
if (importsBracketDepth <= 0) {
|
|
698
|
-
closeInImportsAfterLine = true;
|
|
699
|
-
importsBracketDepth = 0;
|
|
700
|
-
}
|
|
701
|
-
}
|
|
702
|
-
else if (inImports) {
|
|
703
|
-
importsBracketDepth += countBracketBalance(line);
|
|
704
|
-
if (importsBracketDepth <= 0) {
|
|
705
|
-
closeInImportsAfterLine = true;
|
|
706
|
-
importsBracketDepth = 0;
|
|
707
|
-
}
|
|
708
|
-
}
|
|
709
|
-
// R-1 fix: use bracket-depth tracking for providers/controllers too
|
|
710
|
-
// (same approach as imports) so single-line arrays close correctly.
|
|
711
|
-
let closeProvidersAfterLine = false;
|
|
712
|
-
if (/providers:\s*\[/.test(line)) {
|
|
713
|
-
inProviders = true;
|
|
714
|
-
providersBracketDepth += countBracketBalance(line.slice(line.indexOf("[", line.indexOf("providers"))));
|
|
715
|
-
if (providersBracketDepth <= 0) {
|
|
716
|
-
closeProvidersAfterLine = true;
|
|
717
|
-
providersBracketDepth = 0;
|
|
718
|
-
}
|
|
719
|
-
}
|
|
720
|
-
else if (inProviders) {
|
|
721
|
-
providersBracketDepth += countBracketBalance(line);
|
|
722
|
-
if (providersBracketDepth <= 0) {
|
|
723
|
-
closeProvidersAfterLine = true;
|
|
724
|
-
providersBracketDepth = 0;
|
|
725
|
-
}
|
|
726
|
-
}
|
|
727
|
-
let closeControllersAfterLine = false;
|
|
728
|
-
if (/controllers:\s*\[/.test(line)) {
|
|
729
|
-
inControllers = true;
|
|
730
|
-
controllersBracketDepth += countBracketBalance(line.slice(line.indexOf("[", line.indexOf("controllers"))));
|
|
731
|
-
if (controllersBracketDepth <= 0) {
|
|
732
|
-
closeControllersAfterLine = true;
|
|
733
|
-
controllersBracketDepth = 0;
|
|
734
|
-
}
|
|
735
|
-
}
|
|
736
|
-
else if (inControllers) {
|
|
737
|
-
controllersBracketDepth += countBracketBalance(line);
|
|
738
|
-
if (controllersBracketDepth <= 0) {
|
|
739
|
-
closeControllersAfterLine = true;
|
|
740
|
-
controllersBracketDepth = 0;
|
|
741
|
-
}
|
|
742
|
-
}
|
|
743
|
-
// Extract module imports — scan for all module names on the line (not just
|
|
744
|
-
// the first indented one). Handles single-line `imports: [A, B.forFeature([...]), C]`
|
|
745
|
-
// where multiple modules share one line.
|
|
746
|
-
if (inImports) {
|
|
747
|
-
const moduleRe = /(\w+Module)(?:\.for(Root|Feature)(?:Async)?\s*\()?/g;
|
|
748
|
-
let moduleMatch;
|
|
749
|
-
const matchedThisLine = new Set();
|
|
750
|
-
while ((moduleMatch = moduleRe.exec(line)) !== null) {
|
|
751
|
-
// Avoid duplicates within the same line
|
|
752
|
-
const key = `${moduleMatch[1]}:${moduleMatch.index}`;
|
|
753
|
-
if (matchedThisLine.has(key))
|
|
754
|
-
continue;
|
|
755
|
-
matchedThisLine.add(key);
|
|
756
|
-
const name = moduleMatch[1];
|
|
757
|
-
const dynamicKind = moduleMatch[2]; // "Root" | "Feature" | undefined
|
|
758
|
-
const isGlobal = /isGlobal:\s*true/.test(line) || /ConfigModule|SentryModule/.test(name);
|
|
759
|
-
const entry = {
|
|
760
|
-
name,
|
|
761
|
-
file: filePath,
|
|
762
|
-
line: lineNum,
|
|
763
|
-
imported_from: importMap.get(name) ?? null,
|
|
764
|
-
is_global: isGlobal,
|
|
765
|
-
};
|
|
766
|
-
// G2: forFeature([...]) — extract entity class names (scan ahead up to 15 lines)
|
|
767
|
-
if (dynamicKind === "Feature") {
|
|
768
|
-
const entities = [];
|
|
769
|
-
let bracketDepth = 0;
|
|
770
|
-
let started = false;
|
|
771
|
-
for (let j = i; j < Math.min(i + 15, lines.length); j++) {
|
|
772
|
-
for (const ch of lines[j]) {
|
|
773
|
-
if (ch === "[") {
|
|
774
|
-
bracketDepth++;
|
|
775
|
-
started = true;
|
|
776
|
-
}
|
|
777
|
-
else if (ch === "]") {
|
|
778
|
-
bracketDepth--;
|
|
779
|
-
if (started && bracketDepth === 0)
|
|
780
|
-
break;
|
|
781
|
-
}
|
|
782
|
-
}
|
|
783
|
-
// Capture entity names after the opening [
|
|
784
|
-
const featureMatch = lines[j].match(/forFeature\s*\(\s*\[([^\]]*)\]?/);
|
|
785
|
-
if (featureMatch) {
|
|
786
|
-
const inner = featureMatch[1];
|
|
787
|
-
for (const m of inner.matchAll(/\b([A-Z]\w*)\b/g))
|
|
788
|
-
entities.push(m[1]);
|
|
789
|
-
// Continue to next lines if the array spans multiple
|
|
790
|
-
for (let k = j + 1; k < Math.min(j + 10, lines.length) && !/\]/.test(lines[k - 1]); k++) {
|
|
791
|
-
for (const m of lines[k].matchAll(/\b([A-Z]\w*)\b/g))
|
|
792
|
-
entities.push(m[1]);
|
|
793
|
-
}
|
|
794
|
-
break;
|
|
795
|
-
}
|
|
796
|
-
// Multi-line case: forFeature([ on one line, entities on next
|
|
797
|
-
if (/forFeature\s*\(\s*\[\s*$/.test(lines[j])) {
|
|
798
|
-
for (let k = j + 1; k < Math.min(j + 10, lines.length); k++) {
|
|
799
|
-
if (/^\s*\]/.test(lines[k]))
|
|
800
|
-
break;
|
|
801
|
-
for (const m of lines[k].matchAll(/\b([A-Z]\w*)\b/g))
|
|
802
|
-
entities.push(m[1]);
|
|
803
|
-
}
|
|
804
|
-
break;
|
|
805
|
-
}
|
|
806
|
-
}
|
|
807
|
-
if (entities.length > 0)
|
|
808
|
-
entry.entities = entities;
|
|
809
|
-
}
|
|
810
|
-
// G2: forRoot({...}) — extract top-level config keys
|
|
811
|
-
if (dynamicKind === "Root") {
|
|
812
|
-
const keys = [];
|
|
813
|
-
let braceDepth = 0;
|
|
814
|
-
for (let j = i; j < Math.min(i + 15, lines.length); j++) {
|
|
815
|
-
for (const ch of lines[j]) {
|
|
816
|
-
if (ch === "{")
|
|
817
|
-
braceDepth++;
|
|
818
|
-
else if (ch === "}")
|
|
819
|
-
braceDepth--;
|
|
820
|
-
}
|
|
821
|
-
// Only capture keys at the top-level of the forRoot config object
|
|
822
|
-
if (braceDepth >= 1) {
|
|
823
|
-
// Match indented key: value pattern at top-level (heuristic: 1-level indent)
|
|
824
|
-
const keyMatch = lines[j].match(/^\s{6,10}(\w+):\s*/);
|
|
825
|
-
if (keyMatch && !keys.includes(keyMatch[1]))
|
|
826
|
-
keys.push(keyMatch[1]);
|
|
827
|
-
}
|
|
828
|
-
if (braceDepth === 0 && j > i)
|
|
829
|
-
break;
|
|
830
|
-
}
|
|
831
|
-
if (keys.length > 0)
|
|
832
|
-
entry.dynamic_config_keys = keys;
|
|
833
|
-
}
|
|
834
|
-
modules.push(entry);
|
|
835
|
-
}
|
|
836
|
-
// Extract ThrottlerModule config
|
|
837
|
-
if (/ThrottlerModule/.test(line)) {
|
|
838
|
-
// Scan ahead for ttl and limit
|
|
839
|
-
for (let j = i; j < Math.min(i + 15, lines.length); j++) {
|
|
840
|
-
const ttlMatch = lines[j].match(/ttl:\s*(\d+)/);
|
|
841
|
-
const limitMatch = lines[j].match(/limit:\s*(?:.*?:\s*)?(\d+)/);
|
|
842
|
-
if (ttlMatch && !throttler) {
|
|
843
|
-
throttler = { ttl: parseInt(ttlMatch[1]), limit: 60 };
|
|
844
|
-
}
|
|
845
|
-
if (limitMatch && throttler) {
|
|
846
|
-
// Take the production value (non-development)
|
|
847
|
-
const allLimits = lines[j].match(/(\d+)/g);
|
|
848
|
-
if (allLimits && allLimits.length > 0) {
|
|
849
|
-
throttler.limit = parseInt(allLimits[allLimits.length - 1]);
|
|
850
|
-
}
|
|
851
|
-
}
|
|
852
|
-
}
|
|
853
|
-
}
|
|
854
|
-
}
|
|
855
|
-
// Extract controllers
|
|
856
|
-
if (inControllers) {
|
|
857
|
-
const ctrlMatch = line.match(/(\w+Controller)\b/);
|
|
858
|
-
if (ctrlMatch)
|
|
859
|
-
controllers.push(ctrlMatch[1]);
|
|
860
|
-
}
|
|
861
|
-
// Extract global providers (APP_GUARD, APP_FILTER, APP_PIPE)
|
|
862
|
-
if (inProviders) {
|
|
863
|
-
if (/provide:\s*APP_GUARD/.test(line)) {
|
|
864
|
-
// Scan for useClass on next lines
|
|
865
|
-
for (let j = i; j < Math.min(i + 5, lines.length); j++) {
|
|
866
|
-
const useClassMatch = lines[j].match(/useClass:\s*(\w+)/);
|
|
867
|
-
if (useClassMatch) {
|
|
868
|
-
global_guards.push({
|
|
869
|
-
name: useClassMatch[1],
|
|
870
|
-
token: "APP_GUARD",
|
|
871
|
-
file: filePath,
|
|
872
|
-
line: j + 1,
|
|
873
|
-
imported_from: importMap.get(useClassMatch[1]) ?? null,
|
|
874
|
-
});
|
|
875
|
-
break;
|
|
876
|
-
}
|
|
877
|
-
}
|
|
878
|
-
}
|
|
879
|
-
if (/provide:\s*APP_FILTER/.test(line)) {
|
|
880
|
-
for (let j = i; j < Math.min(i + 5, lines.length); j++) {
|
|
881
|
-
const useClassMatch = lines[j].match(/useClass:\s*(\w+)/);
|
|
882
|
-
if (useClassMatch) {
|
|
883
|
-
global_filters.push({
|
|
884
|
-
name: useClassMatch[1],
|
|
885
|
-
token: "APP_FILTER",
|
|
886
|
-
file: filePath,
|
|
887
|
-
line: j + 1,
|
|
888
|
-
imported_from: importMap.get(useClassMatch[1]) ?? null,
|
|
889
|
-
});
|
|
890
|
-
break;
|
|
891
|
-
}
|
|
892
|
-
}
|
|
893
|
-
}
|
|
894
|
-
if (/provide:\s*APP_PIPE/.test(line)) {
|
|
895
|
-
for (let j = i; j < Math.min(i + 5, lines.length); j++) {
|
|
896
|
-
const useClassMatch = lines[j].match(/useClass:\s*(\w+)/);
|
|
897
|
-
if (useClassMatch) {
|
|
898
|
-
global_pipes.push({
|
|
899
|
-
name: useClassMatch[1],
|
|
900
|
-
token: "APP_PIPE",
|
|
901
|
-
file: filePath,
|
|
902
|
-
line: j + 1,
|
|
903
|
-
imported_from: importMap.get(useClassMatch[1]) ?? null,
|
|
904
|
-
});
|
|
905
|
-
break;
|
|
906
|
-
}
|
|
907
|
-
}
|
|
908
|
-
}
|
|
909
|
-
if (/provide:\s*APP_INTERCEPTOR/.test(line)) {
|
|
910
|
-
for (let j = i; j < Math.min(i + 5, lines.length); j++) {
|
|
911
|
-
const useClassMatch = lines[j].match(/useClass:\s*(\w+)/);
|
|
912
|
-
if (useClassMatch) {
|
|
913
|
-
global_interceptors.push({
|
|
914
|
-
name: useClassMatch[1],
|
|
915
|
-
token: "APP_INTERCEPTOR",
|
|
916
|
-
file: filePath,
|
|
917
|
-
line: j + 1,
|
|
918
|
-
imported_from: importMap.get(useClassMatch[1]) ?? null,
|
|
919
|
-
});
|
|
920
|
-
break;
|
|
921
|
-
}
|
|
922
|
-
}
|
|
923
|
-
}
|
|
924
|
-
}
|
|
925
|
-
// Close inImports at end of line iteration if brackets balanced
|
|
926
|
-
if (closeInImportsAfterLine)
|
|
927
|
-
inImports = false;
|
|
928
|
-
if (closeProvidersAfterLine)
|
|
929
|
-
inProviders = false;
|
|
930
|
-
if (closeControllersAfterLine)
|
|
931
|
-
inControllers = false;
|
|
932
|
-
}
|
|
933
|
-
// G1: parse middleware.configure(consumer) chains
|
|
934
|
-
const middleware_chains = parseMiddlewareChains(source, filePath);
|
|
935
|
-
return { modules, global_guards, global_filters, global_pipes, global_interceptors, controllers, throttler, middleware_chains };
|
|
936
|
-
}
|
|
937
|
-
/**
|
|
938
|
-
* G1: Parse `configure(consumer: MiddlewareConsumer) { ... }` blocks.
|
|
939
|
-
* Extracts consumer.apply(Middleware).forRoutes(...) chains.
|
|
940
|
-
*/
|
|
941
|
-
export function parseMiddlewareChains(source, filePath) {
|
|
942
|
-
const results = [];
|
|
943
|
-
// Find configure( method — can be `configure(consumer` or `configure(consumer: MiddlewareConsumer)`
|
|
944
|
-
const configureStart = source.search(/\bconfigure\s*\(\s*\w+\s*(?::\s*\w+)?\s*\)\s*\{/);
|
|
945
|
-
if (configureStart === -1)
|
|
946
|
-
return results;
|
|
947
|
-
// Extract body of configure method via brace counting
|
|
948
|
-
const bodyStart = source.indexOf("{", configureStart);
|
|
949
|
-
if (bodyStart === -1)
|
|
950
|
-
return results;
|
|
951
|
-
let depth = 1;
|
|
952
|
-
let i = bodyStart + 1;
|
|
953
|
-
while (i < source.length && depth > 0) {
|
|
954
|
-
if (source[i] === "{")
|
|
955
|
-
depth++;
|
|
956
|
-
else if (source[i] === "}")
|
|
957
|
-
depth--;
|
|
958
|
-
i++;
|
|
959
|
-
}
|
|
960
|
-
const body = source.slice(bodyStart + 1, i - 1);
|
|
961
|
-
// Match: consumer.apply(Middleware).forRoutes(<args>) — may chain multiple middlewares
|
|
962
|
-
// Use a tolerant pattern that captures the apply(...) arg and forRoutes(...) arg separately.
|
|
963
|
-
const applyRe = /\.apply\s*\(\s*([\w,\s]+)\s*\)\s*\.forRoutes\s*\(([\s\S]*?)\)\s*[;}]/g;
|
|
964
|
-
let m;
|
|
965
|
-
while ((m = applyRe.exec(body)) !== null) {
|
|
966
|
-
const middlewareNames = m[1].split(",").map((s) => s.trim()).filter(Boolean);
|
|
967
|
-
const routesArg = m[2];
|
|
968
|
-
const routes = [];
|
|
969
|
-
// Parse routesArg — supports:
|
|
970
|
-
// '*'
|
|
971
|
-
// 'users/*'
|
|
972
|
-
// { path: 'users', method: RequestMethod.GET }
|
|
973
|
-
// ControllerClass
|
|
974
|
-
const stringPathRe = /['"`]([^'"`]+)['"`]/g;
|
|
975
|
-
let sm;
|
|
976
|
-
while ((sm = stringPathRe.exec(routesArg)) !== null) {
|
|
977
|
-
// Check if this string is part of a { path: '...', method: ... } object literal
|
|
978
|
-
const before = routesArg.slice(Math.max(0, sm.index - 30), sm.index);
|
|
979
|
-
if (/path:\s*$/.test(before)) {
|
|
980
|
-
// Object form — capture path AND method
|
|
981
|
-
const objRe = /path:\s*['"`]([^'"`]+)['"`]\s*,\s*method:\s*(?:RequestMethod\.)?(\w+)/;
|
|
982
|
-
const afterContext = routesArg.slice(Math.max(0, sm.index - 20), sm.index + 200);
|
|
983
|
-
const objMatch = objRe.exec(afterContext);
|
|
984
|
-
if (objMatch) {
|
|
985
|
-
routes.push({ path: objMatch[1], method: objMatch[2] });
|
|
986
|
-
continue;
|
|
987
|
-
}
|
|
988
|
-
}
|
|
989
|
-
routes.push({ path: sm[1] });
|
|
990
|
-
}
|
|
991
|
-
// Also capture bare ControllerClass (PascalCase identifier) if present
|
|
992
|
-
for (const name of middlewareNames) {
|
|
993
|
-
// R-3 fix: guard indexOf returning -1 (would produce wrong line via slice(0,-1))
|
|
994
|
-
const namePos = source.indexOf(name, configureStart);
|
|
995
|
-
const line = namePos >= 0 ? source.slice(0, namePos).split("\n").length : 0;
|
|
996
|
-
results.push({ middleware: name, routes, file: filePath, line });
|
|
997
|
-
}
|
|
998
|
-
}
|
|
999
|
-
return results;
|
|
1000
|
-
}
|
|
1001
|
-
export function extractNextConventions(_projectRoot, files) {
|
|
1002
|
-
const pages = [];
|
|
1003
|
-
const api_routes = [];
|
|
1004
|
-
const inngest_functions = [];
|
|
1005
|
-
const webhooks = [];
|
|
1006
|
-
let services_count = 0;
|
|
1007
|
-
let client_component_count = 0;
|
|
1008
|
-
let server_action_count = 0;
|
|
1009
|
-
let middleware = null;
|
|
1010
|
-
const hasAppDir = files.some((f) => f.path.includes("app/"));
|
|
1011
|
-
const hasSrcDir = files.some((f) => f.path.startsWith("src/"));
|
|
1012
|
-
const hasI18n = files.some((f) => f.path.includes("[locale]") || f.path.includes("i18n"));
|
|
1013
|
-
for (const file of files) {
|
|
1014
|
-
const p = file.path;
|
|
1015
|
-
// Middleware
|
|
1016
|
-
if (/^(src\/)?middleware\.(ts|js)$/.test(p)) {
|
|
1017
|
-
middleware = { file: p, matchers: [] };
|
|
1018
|
-
}
|
|
1019
|
-
// App Router pages (paths from index have no leading /)
|
|
1020
|
-
if (/app\/.*\/page\.(tsx|jsx|ts|js)$/.test(p)) {
|
|
1021
|
-
pages.push({ path: p, type: "page" });
|
|
1022
|
-
}
|
|
1023
|
-
if (/app\/.*\/layout\.(tsx|jsx|ts|js)$/.test(p)) {
|
|
1024
|
-
pages.push({ path: p, type: "layout" });
|
|
1025
|
-
}
|
|
1026
|
-
if (/app\/.*\/loading\.(tsx|jsx|ts|js)$/.test(p)) {
|
|
1027
|
-
pages.push({ path: p, type: "loading" });
|
|
1028
|
-
}
|
|
1029
|
-
if (/app\/.*\/error\.(tsx|jsx|ts|js)$/.test(p)) {
|
|
1030
|
-
pages.push({ path: p, type: "error" });
|
|
1031
|
-
}
|
|
1032
|
-
if (/app\/.*\/not-found\.(tsx|jsx|ts|js)$/.test(p)) {
|
|
1033
|
-
pages.push({ path: p, type: "not-found" });
|
|
1034
|
-
}
|
|
1035
|
-
if (/app\/.*\/global-error\.(tsx|jsx|ts|js)$/.test(p)) {
|
|
1036
|
-
pages.push({ path: p, type: "global-error" });
|
|
1037
|
-
}
|
|
1038
|
-
if (/app\/.*\/default\.(tsx|jsx|ts|js)$/.test(p)) {
|
|
1039
|
-
pages.push({ path: p, type: "default" });
|
|
1040
|
-
}
|
|
1041
|
-
if (/app\/.*\/template\.(tsx|jsx|ts|js)$/.test(p)) {
|
|
1042
|
-
pages.push({ path: p, type: "template" });
|
|
1043
|
-
}
|
|
1044
|
-
// API routes (App Router — route.ts files under app/api/)
|
|
1045
|
-
if (/app\/api\/.*route\.(ts|js)$/.test(p)) {
|
|
1046
|
-
api_routes.push({ path: p, methods: [], file: p });
|
|
1047
|
-
}
|
|
1048
|
-
// Pages Router API routes
|
|
1049
|
-
if (/pages\/api\//.test(p)) {
|
|
1050
|
-
api_routes.push({ path: p, methods: [], file: p });
|
|
1051
|
-
}
|
|
1052
|
-
// Inngest functions
|
|
1053
|
-
if (/inngest\/.*\.(ts|js)$/.test(p) && !/\.test\./.test(p) && !/\.spec\./.test(p) && !/index\./.test(p)) {
|
|
1054
|
-
inngest_functions.push(p);
|
|
1055
|
-
}
|
|
1056
|
-
// Services
|
|
1057
|
-
if (/services?\/[^/]+\.(ts|js)$/.test(p) && !/\.test\./.test(p) && !/\.spec\./.test(p) && !/\.d\.ts$/.test(p) && !/index\./.test(p)) {
|
|
1058
|
-
services_count++;
|
|
1059
|
-
}
|
|
1060
|
-
// Webhooks
|
|
1061
|
-
if (/webhook/.test(p) && /route\.(ts|js)$/.test(p)) {
|
|
1062
|
-
webhooks.push(p);
|
|
1063
|
-
}
|
|
1064
|
-
// Directive scanning — check first line for "use client" / "use server"
|
|
1065
|
-
if (/\.(tsx|ts|jsx|js)$/.test(p) && /app\//.test(p)) {
|
|
1066
|
-
try {
|
|
1067
|
-
const head = readFileSync(join(_projectRoot, p), { encoding: "utf8", flag: "r" }).slice(0, 80);
|
|
1068
|
-
if (/['"]use client['"]/.test(head))
|
|
1069
|
-
client_component_count++;
|
|
1070
|
-
if (/['"]use server['"]/.test(head))
|
|
1071
|
-
server_action_count++;
|
|
1072
|
-
}
|
|
1073
|
-
catch {
|
|
1074
|
-
// file may have been deleted since indexing
|
|
1075
|
-
}
|
|
1076
|
-
}
|
|
1077
|
-
}
|
|
1078
|
-
return {
|
|
1079
|
-
pages,
|
|
1080
|
-
middleware,
|
|
1081
|
-
api_routes,
|
|
1082
|
-
services_count,
|
|
1083
|
-
client_component_count,
|
|
1084
|
-
server_action_count,
|
|
1085
|
-
inngest_functions,
|
|
1086
|
-
webhooks,
|
|
1087
|
-
config: { app_router: hasAppDir, src_dir: hasSrcDir, i18n: hasI18n },
|
|
1088
|
-
};
|
|
1089
|
-
}
|
|
1090
|
-
export function extractExpressConventions(source, filePath) {
|
|
1091
|
-
const lines = source.split("\n");
|
|
1092
|
-
const middleware = [];
|
|
1093
|
-
const routers = [];
|
|
1094
|
-
const error_handlers = [];
|
|
1095
|
-
// Import map
|
|
1096
|
-
const importMap = new Map();
|
|
1097
|
-
for (const line of lines) {
|
|
1098
|
-
const req = line.match(/(?:const|let|var)\s+(\w+)\s*=\s*require\s*\(\s*['"]([^'"]+)['"]\s*\)/);
|
|
1099
|
-
if (req)
|
|
1100
|
-
importMap.set(req[1], req[2]);
|
|
1101
|
-
const imp = line.match(/import\s+(?:\{([^}]+)\}|(\w+))\s+from\s+['"]([^'"]+)['"]/);
|
|
1102
|
-
if (imp) {
|
|
1103
|
-
const names = imp[1] ? imp[1].split(",").map((n) => n.trim()) : [imp[2]];
|
|
1104
|
-
for (const n of names)
|
|
1105
|
-
importMap.set(n, imp[3]);
|
|
1106
|
-
}
|
|
1107
|
-
}
|
|
1108
|
-
for (let i = 0; i < lines.length; i++) {
|
|
1109
|
-
const line = lines[i];
|
|
1110
|
-
const lineNum = i + 1;
|
|
1111
|
-
// app.use(middleware)
|
|
1112
|
-
const useMatch = line.match(/app\.use\s*\(\s*(\w+)\s*\)/);
|
|
1113
|
-
if (useMatch) {
|
|
1114
|
-
middleware.push({ name: useMatch[1], file: filePath, line: lineNum });
|
|
1115
|
-
continue;
|
|
1116
|
-
}
|
|
1117
|
-
// app.use("/path", router)
|
|
1118
|
-
const routeMatch = line.match(/app\.use\s*\(\s*['"]([^'"]+)['"]\s*,\s*(\w+)\s*\)/);
|
|
1119
|
-
if (routeMatch) {
|
|
1120
|
-
routers.push({
|
|
1121
|
-
mount_path: routeMatch[1],
|
|
1122
|
-
file: filePath,
|
|
1123
|
-
line: lineNum,
|
|
1124
|
-
imported_from: importMap.get(routeMatch[2]) ?? null,
|
|
1125
|
-
});
|
|
1126
|
-
continue;
|
|
1127
|
-
}
|
|
1128
|
-
// Error handler: (err, req, res, next) => ...
|
|
1129
|
-
if (/app\.use\s*\(\s*(?:function\s*)?\(\s*err\s*,/.test(line) || /app\.use\s*\(\s*\(\s*err\s*:/.test(line)) {
|
|
1130
|
-
error_handlers.push({ file: filePath, line: lineNum });
|
|
1131
|
-
}
|
|
1132
|
-
}
|
|
1133
|
-
return { middleware, routers, error_handlers };
|
|
1134
|
-
}
|
|
1135
|
-
export function extractReactConventions(files, deps, symbols) {
|
|
1136
|
-
// State management
|
|
1137
|
-
let state_management = null;
|
|
1138
|
-
if (deps["@reduxjs/toolkit"] || deps["redux"])
|
|
1139
|
-
state_management = "redux";
|
|
1140
|
-
else if (deps["zustand"])
|
|
1141
|
-
state_management = "zustand";
|
|
1142
|
-
else if (deps["jotai"])
|
|
1143
|
-
state_management = "jotai";
|
|
1144
|
-
else if (deps["recoil"])
|
|
1145
|
-
state_management = "recoil";
|
|
1146
|
-
else if (deps["mobx"])
|
|
1147
|
-
state_management = "mobx";
|
|
1148
|
-
// Routing
|
|
1149
|
-
let routing = null;
|
|
1150
|
-
if (deps["react-router-dom"] || deps["react-router"])
|
|
1151
|
-
routing = "react-router";
|
|
1152
|
-
else if (deps["@tanstack/react-router"])
|
|
1153
|
-
routing = "tanstack-router";
|
|
1154
|
-
else if (deps["wouter"])
|
|
1155
|
-
routing = "wouter";
|
|
1156
|
-
// UI library
|
|
1157
|
-
// shadcn/ui detection: canonical path pattern is components/ui/*.tsx — checked
|
|
1158
|
-
// FIRST so it takes precedence over generic radix dep (shadcn re-exports radix).
|
|
1159
|
-
const hasShadcnFiles = files.some((f) => /(^|\/)components\/ui\/[a-z-]+\.(tsx|jsx)$/.test(f.path));
|
|
1160
|
-
let ui_library = null;
|
|
1161
|
-
if (hasShadcnFiles)
|
|
1162
|
-
ui_library = "shadcn";
|
|
1163
|
-
else if (deps["@mui/material"])
|
|
1164
|
-
ui_library = "mui";
|
|
1165
|
-
else if (deps["@chakra-ui/react"])
|
|
1166
|
-
ui_library = "chakra";
|
|
1167
|
-
else if (deps["antd"])
|
|
1168
|
-
ui_library = "antd";
|
|
1169
|
-
else if (deps["@radix-ui/react-dialog"] || deps["@radix-ui/themes"])
|
|
1170
|
-
ui_library = "radix";
|
|
1171
|
-
else if (deps["tailwindcss"])
|
|
1172
|
-
ui_library = "tailwind";
|
|
1173
|
-
// Form library detection (Item 7)
|
|
1174
|
-
let form_library = null;
|
|
1175
|
-
if (deps["react-hook-form"])
|
|
1176
|
-
form_library = "react-hook-form";
|
|
1177
|
-
else if (deps["formik"])
|
|
1178
|
-
form_library = "formik";
|
|
1179
|
-
else if (deps["final-form"] || deps["react-final-form"])
|
|
1180
|
-
form_library = "final-form";
|
|
1181
|
-
// File-path-based component counts (legacy, coarse)
|
|
1182
|
-
let pages = 0, components = 0, hooks = 0;
|
|
1183
|
-
for (const f of files) {
|
|
1184
|
-
if (/\/pages?\//.test(f.path) && /\.(tsx|jsx)$/.test(f.path))
|
|
1185
|
-
pages++;
|
|
1186
|
-
else if (/\/components?\//.test(f.path) && /\.(tsx|jsx)$/.test(f.path))
|
|
1187
|
-
components++;
|
|
1188
|
-
if (/\/hooks?\//.test(f.path) || /\.hook\.(ts|js)$/.test(f.path))
|
|
1189
|
-
hooks++;
|
|
1190
|
-
}
|
|
1191
|
-
// Symbol-based semantic counts (requires Wave 1 extractor)
|
|
1192
|
-
let actual_component_count = 0;
|
|
1193
|
-
let actual_hook_count = 0;
|
|
1194
|
-
const hookUsageMap = new Map();
|
|
1195
|
-
const component_patterns = { memo: 0, forwardRef: 0, lazy: 0 };
|
|
1196
|
-
if (symbols) {
|
|
1197
|
-
// Set of stdlib hooks to exclude from "hook usage" tracking — we want
|
|
1198
|
-
// to highlight which library/custom hooks components consume.
|
|
1199
|
-
for (const sym of symbols) {
|
|
1200
|
-
if (sym.kind === "component") {
|
|
1201
|
-
actual_component_count++;
|
|
1202
|
-
if (sym.source) {
|
|
1203
|
-
// Detect wrapper patterns in component source
|
|
1204
|
-
// Generic-aware patterns: memo<Props>(...), forwardRef<T, P>(...), lazy<T>(...) — Item 9
|
|
1205
|
-
if (/\b(?:React\.)?memo\s*(?:<[^>]+>)?\s*\(/.test(sym.source))
|
|
1206
|
-
component_patterns.memo++;
|
|
1207
|
-
if (/\b(?:React\.)?forwardRef\s*(?:<[^>]+>)?\s*\(/.test(sym.source))
|
|
1208
|
-
component_patterns.forwardRef++;
|
|
1209
|
-
if (/\b(?:React\.)?lazy\s*(?:<[^>]+>)?\s*\(/.test(sym.source))
|
|
1210
|
-
component_patterns.lazy++;
|
|
1211
|
-
// Count hook calls inside this component
|
|
1212
|
-
const hookCalls = sym.source.matchAll(/\b(use[A-Z]\w*)\s*\(/g);
|
|
1213
|
-
for (const m of hookCalls) {
|
|
1214
|
-
const hookName = m[1];
|
|
1215
|
-
hookUsageMap.set(hookName, (hookUsageMap.get(hookName) ?? 0) + 1);
|
|
1216
|
-
}
|
|
1217
|
-
}
|
|
1218
|
-
}
|
|
1219
|
-
else if (sym.kind === "hook") {
|
|
1220
|
-
actual_hook_count++;
|
|
1221
|
-
}
|
|
1222
|
-
}
|
|
1223
|
-
}
|
|
1224
|
-
const hook_usage = [...hookUsageMap.entries()]
|
|
1225
|
-
.sort((a, b) => b[1] - a[1])
|
|
1226
|
-
.slice(0, 10)
|
|
1227
|
-
.map(([name, count]) => ({ name, count }));
|
|
1228
|
-
return {
|
|
1229
|
-
state_management,
|
|
1230
|
-
routing,
|
|
1231
|
-
ui_library,
|
|
1232
|
-
form_library,
|
|
1233
|
-
component_count: { pages, components, hooks },
|
|
1234
|
-
actual_component_count,
|
|
1235
|
-
actual_hook_count,
|
|
1236
|
-
hook_usage,
|
|
1237
|
-
component_patterns,
|
|
1238
|
-
};
|
|
1239
|
-
}
|
|
1240
|
-
export function extractPythonConventions(files) {
|
|
1241
|
-
const routers = [];
|
|
1242
|
-
const middlewareSet = new Set();
|
|
1243
|
-
let models_dir = null;
|
|
1244
|
-
let framework_type = null;
|
|
1245
|
-
for (const f of files) {
|
|
1246
|
-
// FastAPI routers
|
|
1247
|
-
if (/router\.py$|routes?\.py$/.test(f.path)) {
|
|
1248
|
-
routers.push({ path: f.path, file: f.path });
|
|
1249
|
-
if (!framework_type)
|
|
1250
|
-
framework_type = "fastapi";
|
|
1251
|
-
}
|
|
1252
|
-
// Django views/urls
|
|
1253
|
-
if (/views\.py$|urls\.py$/.test(f.path)) {
|
|
1254
|
-
routers.push({ path: f.path, file: f.path });
|
|
1255
|
-
if (!framework_type)
|
|
1256
|
-
framework_type = "django";
|
|
1257
|
-
}
|
|
1258
|
-
// Flask blueprints
|
|
1259
|
-
if (/blueprint/.test(f.path)) {
|
|
1260
|
-
routers.push({ path: f.path, file: f.path });
|
|
1261
|
-
if (!framework_type)
|
|
1262
|
-
framework_type = "flask";
|
|
1263
|
-
}
|
|
1264
|
-
// Middleware
|
|
1265
|
-
if (/middleware/.test(f.path) && f.path.endsWith(".py")) {
|
|
1266
|
-
middlewareSet.add(f.path);
|
|
1267
|
-
}
|
|
1268
|
-
// Models
|
|
1269
|
-
if (/models?\.py$/.test(f.path) && !models_dir) {
|
|
1270
|
-
const dir = f.path.split("/").slice(0, -1).join("/");
|
|
1271
|
-
models_dir = dir || null;
|
|
1272
|
-
}
|
|
1273
|
-
}
|
|
1274
|
-
// Test framework detection
|
|
1275
|
-
let test_framework = null;
|
|
1276
|
-
if (files.some((f) => /conftest\.py$/.test(f.path) || /test_.*\.py$/.test(f.path))) {
|
|
1277
|
-
test_framework = "pytest";
|
|
1278
|
-
}
|
|
1279
|
-
else if (files.some((f) => /tests?\.py$/.test(f.path))) {
|
|
1280
|
-
test_framework = "unittest";
|
|
1281
|
-
}
|
|
1282
|
-
return {
|
|
1283
|
-
framework_type,
|
|
1284
|
-
routers,
|
|
1285
|
-
middleware: [...middlewareSet],
|
|
1286
|
-
models_dir,
|
|
1287
|
-
test_framework,
|
|
1288
|
-
};
|
|
1289
|
-
}
|
|
1290
|
-
export function extractPhpConventions(files) {
|
|
1291
|
-
const controllers = [];
|
|
1292
|
-
const middleware = [];
|
|
1293
|
-
const models = [];
|
|
1294
|
-
const routes_files = [];
|
|
1295
|
-
let migrations_count = 0;
|
|
1296
|
-
for (const f of files) {
|
|
1297
|
-
const name = f.path.split("/").pop()?.replace(/\.php$/, "") ?? "";
|
|
1298
|
-
if (/Controller\.php$/.test(f.path)) {
|
|
1299
|
-
controllers.push({ name, path: f.path });
|
|
1300
|
-
}
|
|
1301
|
-
if (/(^|\/)[Mm]iddleware\//.test(f.path) && f.path.endsWith(".php")) {
|
|
1302
|
-
middleware.push({ name, path: f.path });
|
|
1303
|
-
}
|
|
1304
|
-
if (/(^|\/)[Mm]odels?\//.test(f.path) && f.path.endsWith(".php")) {
|
|
1305
|
-
models.push({ name, path: f.path });
|
|
1306
|
-
}
|
|
1307
|
-
if (/(^|\/)routes\//.test(f.path) && f.path.endsWith(".php")) {
|
|
1308
|
-
routes_files.push(f.path);
|
|
1309
|
-
}
|
|
1310
|
-
if (/(^|\/)migrations?\//.test(f.path)) {
|
|
1311
|
-
migrations_count++;
|
|
1312
|
-
}
|
|
1313
|
-
}
|
|
1314
|
-
return { controllers, middleware, models, routes_files, migrations_count };
|
|
1315
|
-
}
|
|
1316
|
-
export function extractYii2Conventions(files) {
|
|
1317
|
-
const base = extractPhpConventions(files);
|
|
1318
|
-
const modules = [];
|
|
1319
|
-
const widgets = [];
|
|
1320
|
-
const behaviors = [];
|
|
1321
|
-
const components = [];
|
|
1322
|
-
const assets = [];
|
|
1323
|
-
const config_files = [];
|
|
1324
|
-
for (const f of files) {
|
|
1325
|
-
const name = f.path.split("/").pop()?.replace(/\.php$/, "") ?? "";
|
|
1326
|
-
// Modules: Module.php in modules/*/ directories
|
|
1327
|
-
if (/(^|\/)modules\/[^/]+\/Module\.php$/.test(f.path)) {
|
|
1328
|
-
modules.push({ name, path: f.path });
|
|
1329
|
-
}
|
|
1330
|
-
// Widgets: files in widgets/ directories or named *Widget.php
|
|
1331
|
-
if ((/(^|\/)widgets\//.test(f.path) || /Widget\.php$/.test(f.path)) && f.path.endsWith(".php")) {
|
|
1332
|
-
widgets.push({ name, path: f.path });
|
|
1333
|
-
}
|
|
1334
|
-
// Behaviors: files in behaviors/ directories or named *Behavior.php
|
|
1335
|
-
if ((/(^|\/)behaviors\//.test(f.path) || /Behavior\.php$/.test(f.path)) && f.path.endsWith(".php")) {
|
|
1336
|
-
behaviors.push({ name, path: f.path });
|
|
1337
|
-
}
|
|
1338
|
-
// Components: files in components/ directory
|
|
1339
|
-
if (/(^|\/)components\//.test(f.path) && f.path.endsWith(".php")) {
|
|
1340
|
-
components.push({ name, path: f.path });
|
|
1341
|
-
}
|
|
1342
|
-
// Assets: files named *Asset.php in assets/ directory
|
|
1343
|
-
if (/(^|\/)assets\//.test(f.path) && /Asset\.php$/.test(f.path)) {
|
|
1344
|
-
assets.push({ name, path: f.path });
|
|
1345
|
-
}
|
|
1346
|
-
// Config files
|
|
1347
|
-
if (/config\/(web|console|db|params|main|test)\.php$/.test(f.path)) {
|
|
1348
|
-
config_files.push(f.path);
|
|
1349
|
-
}
|
|
1350
|
-
}
|
|
1351
|
-
return {
|
|
1352
|
-
...base,
|
|
1353
|
-
framework_type: "yii2",
|
|
1354
|
-
modules,
|
|
1355
|
-
widgets,
|
|
1356
|
-
behaviors,
|
|
1357
|
-
components,
|
|
1358
|
-
assets,
|
|
1359
|
-
config_files,
|
|
1360
|
-
};
|
|
1361
|
-
}
|
|
1362
|
-
// ---------------------------------------------------------------------------
|
|
1363
|
-
// Identity Extractor
|
|
1364
|
-
// ---------------------------------------------------------------------------
|
|
1365
|
-
async function extractIdentity(projectRoot) {
|
|
1366
|
-
const pkg = await readJson(join(projectRoot, "package.json"));
|
|
1367
|
-
const projectName = pkg?.name ?? projectRoot.split("/").pop() ?? "unknown";
|
|
1368
|
-
// Detect monorepo
|
|
1369
|
-
const isMonorepo = !!(pkg?.workspaces || await fileExists(join(projectRoot, "pnpm-workspace.yaml")));
|
|
1370
|
-
// Git remote
|
|
1371
|
-
let gitRemote = null;
|
|
1372
|
-
try {
|
|
1373
|
-
const { stdout } = await execFileAsync("git", ["config", "--get", "remote.origin.url"], {
|
|
1374
|
-
cwd: projectRoot, timeout: 3000,
|
|
1375
|
-
});
|
|
1376
|
-
gitRemote = stdout.toString().trim().replace(/\.git$/, "").replace(/^git@github\.com:/, "github.com/") || null;
|
|
1377
|
-
}
|
|
1378
|
-
catch { /* not a git repo or no remote */ }
|
|
1379
|
-
return {
|
|
1380
|
-
project_name: projectName,
|
|
1381
|
-
project_type: isMonorepo ? "monorepo" : "single",
|
|
1382
|
-
workspace_root: projectRoot,
|
|
1383
|
-
git_remote: gitRemote,
|
|
1384
|
-
};
|
|
1385
|
-
}
|
|
1386
|
-
// ---------------------------------------------------------------------------
|
|
1387
|
-
// Dependency Graph Extractor
|
|
1388
|
-
// ---------------------------------------------------------------------------
|
|
1389
|
-
function extractDependencyGraph(index) {
|
|
1390
|
-
// Entry points: files matching app/main/server/index at shallow depth
|
|
1391
|
-
const entry_points = [];
|
|
1392
|
-
const importCount = new Map();
|
|
1393
|
-
// Count imports per file from symbols
|
|
1394
|
-
for (const sym of index.symbols) {
|
|
1395
|
-
if (sym.source) {
|
|
1396
|
-
const importMatches = sym.source.match(/from\s+['"]([^'"]+)['"]/g);
|
|
1397
|
-
if (importMatches) {
|
|
1398
|
-
for (const m of importMatches) {
|
|
1399
|
-
const path = m.replace(/from\s+['"]/, "").replace(/['"]$/, "");
|
|
1400
|
-
// Resolve relative imports to file paths
|
|
1401
|
-
if (path.startsWith(".")) {
|
|
1402
|
-
const resolved = join(sym.file.replace(/\/[^/]+$/, ""), path).replace(/\.(js|ts|tsx|jsx)$/, "");
|
|
1403
|
-
importCount.set(resolved, (importCount.get(resolved) ?? 0) + 1);
|
|
1404
|
-
}
|
|
1405
|
-
}
|
|
1406
|
-
}
|
|
1407
|
-
}
|
|
1408
|
-
}
|
|
1409
|
-
// Find entry points
|
|
1410
|
-
for (const f of index.files) {
|
|
1411
|
-
if (/\/(app|main|server)\.(ts|js|tsx)$/.test(f.path))
|
|
1412
|
-
entry_points.push(f.path);
|
|
1413
|
-
if (/^(src\/)?index\.(ts|js)$/.test(f.path))
|
|
1414
|
-
entry_points.push(f.path);
|
|
1415
|
-
}
|
|
1416
|
-
// Hub modules: files imported by many others
|
|
1417
|
-
const hub_modules = [...importCount.entries()]
|
|
1418
|
-
.filter(([, count]) => count >= 5)
|
|
1419
|
-
.sort((a, b) => b[1] - a[1])
|
|
1420
|
-
.slice(0, 20)
|
|
1421
|
-
.map(([path, count]) => ({ path, imported_by_count: count }));
|
|
1422
|
-
// Leaf modules: files that import others but are not imported themselves
|
|
1423
|
-
const importedFiles = new Set(importCount.keys());
|
|
1424
|
-
const leaf_modules = index.files
|
|
1425
|
-
.filter((f) => !importedFiles.has(f.path.replace(/\.(ts|js|tsx|jsx)$/, "")) && !/(test|spec)\.(ts|js)$/.test(f.path))
|
|
1426
|
-
.slice(0, 30)
|
|
1427
|
-
.map((f) => f.path);
|
|
1428
|
-
// Orphan files: files with no imports AND not imported
|
|
1429
|
-
const orphan_files = index.files
|
|
1430
|
-
.filter((f) => {
|
|
1431
|
-
const base = f.path.replace(/\.(ts|js|tsx|jsx)$/, "");
|
|
1432
|
-
return !importedFiles.has(base) && f.symbol_count === 0 && !/(test|spec)\.(ts|js)$/.test(f.path);
|
|
1433
|
-
})
|
|
1434
|
-
.slice(0, 20)
|
|
1435
|
-
.map((f) => f.path);
|
|
1436
|
-
return { entry_points, hub_modules, leaf_modules, orphan_files };
|
|
1437
|
-
}
|
|
1438
|
-
// ---------------------------------------------------------------------------
|
|
1439
|
-
// Test Conventions Extractor
|
|
1440
|
-
// ---------------------------------------------------------------------------
|
|
1441
|
-
async function extractTestConventions(projectRoot, index) {
|
|
1442
|
-
const testFiles = index.files.filter((f) => /(test|spec)\.(ts|js|tsx|jsx)$/.test(f.path));
|
|
1443
|
-
const file_patterns = [...new Set(testFiles.map((f) => {
|
|
1444
|
-
if (f.path.includes(".test."))
|
|
1445
|
-
return "*.test.*";
|
|
1446
|
-
if (f.path.includes(".spec."))
|
|
1447
|
-
return "*.spec.*";
|
|
1448
|
-
return "*.test.*";
|
|
1449
|
-
}))];
|
|
1450
|
-
// Find setup files
|
|
1451
|
-
const setup_files = [];
|
|
1452
|
-
for (const f of index.files) {
|
|
1453
|
-
if (/setup\.(ts|js)$/.test(f.path) && !/(node_modules|dist|\.next)/.test(f.path)) {
|
|
1454
|
-
setup_files.push(f.path);
|
|
1455
|
-
}
|
|
1456
|
-
if (/vitest\.setup\.(ts|js)$/.test(f.path))
|
|
1457
|
-
setup_files.push(f.path);
|
|
1458
|
-
if (/jest\.setup\.(ts|js)$/.test(f.path))
|
|
1459
|
-
setup_files.push(f.path);
|
|
1460
|
-
}
|
|
1461
|
-
// Detect mock style and common patterns by reading a few test files
|
|
1462
|
-
let mock_style = null;
|
|
1463
|
-
const mock_patterns = [];
|
|
1464
|
-
const common_mocks_set = new Set();
|
|
1465
|
-
// Read up to 5 test files to detect patterns
|
|
1466
|
-
const sampleTests = testFiles
|
|
1467
|
-
.filter((f) => f.path.includes("service") || f.path.includes("controller") || f.path.includes("guard"))
|
|
1468
|
-
.slice(0, 5);
|
|
1469
|
-
for (const tf of sampleTests) {
|
|
1470
|
-
try {
|
|
1471
|
-
const content = await readFile(join(projectRoot, tf.path), "utf-8");
|
|
1472
|
-
// Mock style
|
|
1473
|
-
if (!mock_style) {
|
|
1474
|
-
if (content.includes("vi.mock"))
|
|
1475
|
-
mock_style = "vi.mock";
|
|
1476
|
-
else if (content.includes("jest.mock"))
|
|
1477
|
-
mock_style = "jest.mock";
|
|
1478
|
-
else if (content.includes("sinon"))
|
|
1479
|
-
mock_style = "sinon";
|
|
1480
|
-
}
|
|
1481
|
-
// Common mock patterns — extract vi.mock/jest.mock calls
|
|
1482
|
-
const mockCalls = content.match(/(?:vi|jest)\.mock\s*\(\s*['"]([^'"]+)['"]/g);
|
|
1483
|
-
if (mockCalls) {
|
|
1484
|
-
for (const mc of mockCalls) {
|
|
1485
|
-
const path = mc.match(/['"]([^'"]+)['"]/)?.[1];
|
|
1486
|
-
if (path)
|
|
1487
|
-
common_mocks_set.add(path);
|
|
1488
|
-
}
|
|
1489
|
-
}
|
|
1490
|
-
// Detect specific patterns
|
|
1491
|
-
if (content.includes("mockPrismaClient") || content.includes("prismaMock")) {
|
|
1492
|
-
if (!mock_patterns.some((p) => p.name === "prisma")) {
|
|
1493
|
-
mock_patterns.push({ name: "prisma", import_from: "setup or inline", usage: "mockPrismaClient / prismaMock" });
|
|
1494
|
-
}
|
|
1495
|
-
}
|
|
1496
|
-
if (content.includes("mockDeep") || content.includes("DeepMockProxy")) {
|
|
1497
|
-
if (!mock_patterns.some((p) => p.name === "deep-mock")) {
|
|
1498
|
-
mock_patterns.push({ name: "deep-mock", import_from: "vitest-mock-extended or jest-mock-extended", usage: "mockDeep<Type>()" });
|
|
1499
|
-
}
|
|
1500
|
-
}
|
|
1501
|
-
if (content.includes("$transaction") && content.includes("mock")) {
|
|
1502
|
-
if (!mock_patterns.some((p) => p.name === "transaction")) {
|
|
1503
|
-
mock_patterns.push({ name: "transaction", import_from: "prisma mock", usage: "$transaction mock for DB operations" });
|
|
1504
|
-
}
|
|
1505
|
-
}
|
|
1506
|
-
}
|
|
1507
|
-
catch { /* skip unreadable files */ }
|
|
1508
|
-
}
|
|
1509
|
-
// Also check setup files for shared patterns
|
|
1510
|
-
for (const sf of setup_files) {
|
|
1511
|
-
try {
|
|
1512
|
-
const content = await readFile(join(projectRoot, sf), "utf-8");
|
|
1513
|
-
const exports = content.match(/export\s+(?:const|function|class)\s+(\w+)/g);
|
|
1514
|
-
if (exports) {
|
|
1515
|
-
for (const exp of exports) {
|
|
1516
|
-
const name = exp.match(/(\w+)$/)?.[1];
|
|
1517
|
-
if (name && /mock|stub|fake|fixture|factory/i.test(name)) {
|
|
1518
|
-
mock_patterns.push({ name, import_from: sf, usage: "shared test helper" });
|
|
1519
|
-
}
|
|
1520
|
-
}
|
|
1521
|
-
}
|
|
1522
|
-
}
|
|
1523
|
-
catch { /* skip */ }
|
|
1524
|
-
}
|
|
1525
|
-
// Determine assertion library from stack
|
|
1526
|
-
const pkg = await readJson(join(projectRoot, "package.json"));
|
|
1527
|
-
const devDeps = pkg?.devDependencies ?? {};
|
|
1528
|
-
let assertion_library = "expect"; // default
|
|
1529
|
-
if (devDeps["vitest"])
|
|
1530
|
-
assertion_library = "vitest/expect";
|
|
1531
|
-
else if (devDeps["jest"])
|
|
1532
|
-
assertion_library = "jest/expect";
|
|
1533
|
-
else if (devDeps["chai"])
|
|
1534
|
-
assertion_library = "chai";
|
|
1535
|
-
return {
|
|
1536
|
-
mock_style,
|
|
1537
|
-
setup_files,
|
|
1538
|
-
mock_patterns: mock_patterns.slice(0, 10),
|
|
1539
|
-
assertion_library,
|
|
1540
|
-
file_patterns,
|
|
1541
|
-
common_mocks: [...common_mocks_set].slice(0, 20),
|
|
1542
|
-
};
|
|
1543
|
-
}
|
|
1544
|
-
// ---------------------------------------------------------------------------
|
|
1545
|
-
// Known Gotchas Extractor
|
|
1546
|
-
// ---------------------------------------------------------------------------
|
|
1547
|
-
function extractKnownGotchas(index) {
|
|
1548
|
-
const gotchas = [];
|
|
1549
|
-
// Check for common gotcha patterns in symbols
|
|
1550
|
-
for (const sym of index.symbols) {
|
|
1551
|
-
if (!sym.source)
|
|
1552
|
-
continue;
|
|
1553
|
-
// as any casts in production code (not tests)
|
|
1554
|
-
if (/(test|spec)\.(ts|js)$/.test(sym.file))
|
|
1555
|
-
continue;
|
|
1556
|
-
// Detect patterns that are known gotchas
|
|
1557
|
-
if (/process\.env\.\w+/.test(sym.source) && !/config|env\.schema|validate/.test(sym.file)) {
|
|
1558
|
-
if (!gotchas.some((g) => g.gotcha.includes("scattered process.env"))) {
|
|
1559
|
-
gotchas.push({
|
|
1560
|
-
gotcha: "scattered process.env access outside config module",
|
|
1561
|
-
evidence: [sym.file],
|
|
1562
|
-
severity: "medium",
|
|
1563
|
-
});
|
|
1564
|
-
}
|
|
1565
|
-
}
|
|
1566
|
-
}
|
|
1567
|
-
// Check for common project-level gotchas
|
|
1568
|
-
const hasEslintIgnore = index.files.some((f) => f.path.includes(".eslintignore"));
|
|
1569
|
-
if (hasEslintIgnore) {
|
|
1570
|
-
gotchas.push({
|
|
1571
|
-
gotcha: ".eslintignore present — some files bypass linting",
|
|
1572
|
-
evidence: [".eslintignore"],
|
|
1573
|
-
severity: "low",
|
|
1574
|
-
});
|
|
1575
|
-
}
|
|
1576
|
-
return { auto_detected: gotchas.slice(0, 10) };
|
|
1577
|
-
}
|
|
1578
|
-
// ---------------------------------------------------------------------------
|
|
1579
|
-
// Dependency Health
|
|
1580
|
-
// ---------------------------------------------------------------------------
|
|
1581
|
-
async function extractDependencyHealth(projectRoot) {
|
|
1582
|
-
const pkg = await readJson(join(projectRoot, "package.json"));
|
|
1583
|
-
if (!pkg) {
|
|
1584
|
-
// Try Python
|
|
1585
|
-
const pyproject = await readJson(join(projectRoot, "pyproject.toml"));
|
|
1586
|
-
if (!pyproject)
|
|
1587
|
-
return null;
|
|
1588
|
-
return { total: 0, prod: 0, dev: 0, key_versions: {} };
|
|
1589
|
-
}
|
|
1590
|
-
const prod = Object.keys(pkg.dependencies ?? {});
|
|
1591
|
-
const dev = Object.keys(pkg.devDependencies ?? {});
|
|
1592
|
-
const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
1593
|
-
// Extract key versions — frameworks, runtimes, major tools
|
|
1594
|
-
const keyPackages = [
|
|
1595
|
-
"react", "next", "hono", "@nestjs/core", "express", "vue", "angular",
|
|
1596
|
-
"typescript", "vitest", "jest", "prisma", "@prisma/client",
|
|
1597
|
-
"tailwindcss", "@anthropic-ai/sdk", "openai",
|
|
1598
|
-
"stripe", "inngest", "@clerk/nextjs", "@clerk/backend",
|
|
1599
|
-
"@sentry/nextjs", "@sentry/nestjs", "drizzle-orm",
|
|
1600
|
-
];
|
|
1601
|
-
const key_versions = {};
|
|
1602
|
-
for (const k of keyPackages) {
|
|
1603
|
-
if (allDeps[k])
|
|
1604
|
-
key_versions[k] = allDeps[k];
|
|
1605
|
-
}
|
|
1606
|
-
return {
|
|
1607
|
-
total: prod.length + dev.length,
|
|
1608
|
-
prod: prod.length,
|
|
1609
|
-
dev: dev.length,
|
|
1610
|
-
key_versions,
|
|
1611
|
-
};
|
|
1612
|
-
}
|
|
1613
|
-
// ---------------------------------------------------------------------------
|
|
1614
|
-
// Git Health
|
|
1615
|
-
// ---------------------------------------------------------------------------
|
|
1616
|
-
async function extractGitHealth(projectRoot) {
|
|
1617
|
-
try {
|
|
1618
|
-
const totalRes = await execFileAsync("git", ["rev-list", "--count", "HEAD"], {
|
|
1619
|
-
cwd: projectRoot, timeout: 5000,
|
|
1620
|
-
});
|
|
1621
|
-
const totalStr = totalRes.stdout.toString().trim();
|
|
1622
|
-
const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString();
|
|
1623
|
-
const recentRes = await execFileAsync("git", ["rev-list", "--count", `--since=${thirtyDaysAgo}`, "HEAD"], {
|
|
1624
|
-
cwd: projectRoot, timeout: 5000,
|
|
1625
|
-
});
|
|
1626
|
-
const recentStr = recentRes.stdout.toString().trim();
|
|
1627
|
-
const lastRes = await execFileAsync("git", ["log", "-1", "--format=%aI"], {
|
|
1628
|
-
cwd: projectRoot, timeout: 5000,
|
|
1629
|
-
});
|
|
1630
|
-
const lastCommitDate = lastRes.stdout.toString().trim();
|
|
1631
|
-
const contribRes = await execFileAsync("git", ["shortlog", "-sn", "--no-merges", "HEAD"], {
|
|
1632
|
-
cwd: projectRoot, timeout: 10000,
|
|
1633
|
-
maxBuffer: 5 * 1024 * 1024, // 5MB — many contributors on long-lived repos
|
|
1634
|
-
});
|
|
1635
|
-
const contributorsStr = contribRes.stdout.toString().trim();
|
|
1636
|
-
const contributors = contributorsStr.split("\n").filter(Boolean).length;
|
|
1637
|
-
return {
|
|
1638
|
-
total_commits: parseInt(totalStr) || 0,
|
|
1639
|
-
recent_commits_30d: parseInt(recentStr) || 0,
|
|
1640
|
-
last_commit_date: lastCommitDate || null,
|
|
1641
|
-
contributors,
|
|
1642
|
-
};
|
|
1643
|
-
}
|
|
1644
|
-
catch {
|
|
1645
|
-
return null;
|
|
1646
|
-
}
|
|
1647
|
-
}
|
|
1648
164
|
const analyzeProjectCache = new Map();
|
|
1649
165
|
/** Test-only — clear the analyzeProject cache. */
|
|
1650
166
|
export function resetAnalyzeProjectCacheForTesting() {
|
|
1651
167
|
analyzeProjectCache.clear();
|
|
1652
168
|
}
|
|
169
|
+
async function getProjectCodeIndex(repoName) {
|
|
170
|
+
const { getCodeIndex } = await import("./index-tools.js");
|
|
171
|
+
return getCodeIndex(repoName);
|
|
172
|
+
}
|
|
1653
173
|
export async function analyzeProject(repoName, options = {}) {
|
|
1654
174
|
const startTime = Date.now();
|
|
1655
175
|
let files_analyzed = 0;
|
|
1656
176
|
let files_skipped = 0;
|
|
1657
177
|
const skip_reasons = {};
|
|
1658
|
-
const index = await
|
|
178
|
+
const index = await getProjectCodeIndex(repoName);
|
|
1659
179
|
if (!index) {
|
|
1660
180
|
const failedProfile = {
|
|
1661
181
|
version: "1.0",
|
|
@@ -1698,9 +218,10 @@ export async function analyzeProject(repoName, options = {}) {
|
|
|
1698
218
|
// Step 1: Stack detection
|
|
1699
219
|
const stack = await detectStack(projectRoot);
|
|
1700
220
|
// Step 2: File classification
|
|
1701
|
-
const
|
|
221
|
+
const importerCount = await buildImporterCount(index);
|
|
222
|
+
const file_classifications = classifyFiles(index, importerCount);
|
|
1702
223
|
// Step 2b: Dependency graph
|
|
1703
|
-
const dependency_graph = extractDependencyGraph(index);
|
|
224
|
+
const dependency_graph = extractDependencyGraph(index, importerCount);
|
|
1704
225
|
// Step 2c: Test conventions
|
|
1705
226
|
const test_conventions = await extractTestConventions(projectRoot, index);
|
|
1706
227
|
// Step 2d: Known gotchas
|
|
@@ -1781,6 +302,8 @@ export async function analyzeProject(repoName, options = {}) {
|
|
|
1781
302
|
status = "partial";
|
|
1782
303
|
skip_reasons[`${fw ?? "unknown"}_extractor_error`] = 1;
|
|
1783
304
|
}
|
|
305
|
+
const dependencyHealth = await extractDependencyHealth(projectRoot);
|
|
306
|
+
const gitHealth = await extractGitHealth(projectRoot);
|
|
1784
307
|
const profile = {
|
|
1785
308
|
version: "1.0",
|
|
1786
309
|
generated_at: new Date().toISOString(),
|
|
@@ -1805,8 +328,8 @@ export async function analyzeProject(repoName, options = {}) {
|
|
|
1805
328
|
...(pythonConventions ? { python_conventions: pythonConventions } : {}),
|
|
1806
329
|
...(phpConventions ? { php_conventions: phpConventions } : {}),
|
|
1807
330
|
...(astroConventions ? { astro_conventions: astroConventions } : {}),
|
|
1808
|
-
dependency_health:
|
|
1809
|
-
git_health:
|
|
331
|
+
...(dependencyHealth ? { dependency_health: dependencyHealth } : {}),
|
|
332
|
+
...(gitHealth ? { git_health: gitHealth } : {}),
|
|
1810
333
|
generation_metadata: {
|
|
1811
334
|
files_analyzed,
|
|
1812
335
|
files_skipped,
|
|
@@ -1821,115 +344,6 @@ export async function analyzeProject(repoName, options = {}) {
|
|
|
1821
344
|
return summary;
|
|
1822
345
|
}
|
|
1823
346
|
// ---------------------------------------------------------------------------
|
|
1824
|
-
// Disk persistence — write profile to .zuvo/project-profile.json
|
|
1825
|
-
// ---------------------------------------------------------------------------
|
|
1826
|
-
async function writeProfileToDisk(projectRoot, profile) {
|
|
1827
|
-
const zuvoDir = join(projectRoot, ".zuvo");
|
|
1828
|
-
await mkdir(zuvoDir, { recursive: true });
|
|
1829
|
-
const profilePath = join(zuvoDir, "project-profile.json");
|
|
1830
|
-
await writeFile(profilePath, JSON.stringify(profile, null, 2), "utf-8");
|
|
1831
|
-
return profilePath;
|
|
1832
|
-
}
|
|
1833
|
-
export function buildConventionsSummary(profile) {
|
|
1834
|
-
const p = profile;
|
|
1835
|
-
if (p.conventions)
|
|
1836
|
-
return {
|
|
1837
|
-
middleware_chains: p.conventions.middleware_chains.length,
|
|
1838
|
-
rate_limits: p.conventions.rate_limits.length,
|
|
1839
|
-
route_mounts: p.conventions.route_mounts.length,
|
|
1840
|
-
auth_groups: Object.keys(p.conventions.auth_patterns.groups).length,
|
|
1841
|
-
};
|
|
1842
|
-
if (p.nest_conventions)
|
|
1843
|
-
return {
|
|
1844
|
-
type: "nestjs",
|
|
1845
|
-
modules: p.nest_conventions.modules.length,
|
|
1846
|
-
global_guards: p.nest_conventions.global_guards.length,
|
|
1847
|
-
global_filters: p.nest_conventions.global_filters.length,
|
|
1848
|
-
global_interceptors: p.nest_conventions.global_interceptors.length,
|
|
1849
|
-
controllers: p.nest_conventions.controllers.length,
|
|
1850
|
-
has_throttler: !!p.nest_conventions.throttler,
|
|
1851
|
-
};
|
|
1852
|
-
if (p.next_conventions)
|
|
1853
|
-
return {
|
|
1854
|
-
type: "nextjs",
|
|
1855
|
-
pages: p.next_conventions.pages.length,
|
|
1856
|
-
api_routes: p.next_conventions.api_routes.length,
|
|
1857
|
-
services: p.next_conventions.services_count,
|
|
1858
|
-
inngest_functions: p.next_conventions.inngest_functions.length,
|
|
1859
|
-
webhooks: p.next_conventions.webhooks.length,
|
|
1860
|
-
has_middleware: !!p.next_conventions.middleware,
|
|
1861
|
-
app_router: p.next_conventions.config.app_router,
|
|
1862
|
-
i18n: p.next_conventions.config.i18n,
|
|
1863
|
-
};
|
|
1864
|
-
if (p.express_conventions)
|
|
1865
|
-
return {
|
|
1866
|
-
type: "express",
|
|
1867
|
-
middleware: p.express_conventions.middleware.length,
|
|
1868
|
-
routers: p.express_conventions.routers.length,
|
|
1869
|
-
error_handlers: p.express_conventions.error_handlers.length,
|
|
1870
|
-
};
|
|
1871
|
-
if (p.react_conventions)
|
|
1872
|
-
return {
|
|
1873
|
-
type: "react",
|
|
1874
|
-
...p.react_conventions.component_count,
|
|
1875
|
-
state_management: p.react_conventions.state_management,
|
|
1876
|
-
ui_library: p.react_conventions.ui_library,
|
|
1877
|
-
};
|
|
1878
|
-
if (p.python_conventions)
|
|
1879
|
-
return {
|
|
1880
|
-
type: "python",
|
|
1881
|
-
routers: p.python_conventions.routers.length,
|
|
1882
|
-
middleware: p.python_conventions.middleware.length,
|
|
1883
|
-
framework_type: p.python_conventions.framework_type,
|
|
1884
|
-
};
|
|
1885
|
-
if (p.php_conventions)
|
|
1886
|
-
return {
|
|
1887
|
-
type: "php",
|
|
1888
|
-
controllers: p.php_conventions.controllers.length,
|
|
1889
|
-
middleware: p.php_conventions.middleware.length,
|
|
1890
|
-
models: p.php_conventions.models.length,
|
|
1891
|
-
migrations: p.php_conventions.migrations_count,
|
|
1892
|
-
};
|
|
1893
|
-
if (p.astro_conventions)
|
|
1894
|
-
return {
|
|
1895
|
-
type: "astro",
|
|
1896
|
-
output_mode: p.astro_conventions.output_mode,
|
|
1897
|
-
adapter: p.astro_conventions.adapter,
|
|
1898
|
-
integrations: p.astro_conventions.integrations.length,
|
|
1899
|
-
has_i18n: !!p.astro_conventions.i18n,
|
|
1900
|
-
config_resolution: p.astro_conventions.config_resolution,
|
|
1901
|
-
};
|
|
1902
|
-
return null;
|
|
1903
|
-
}
|
|
1904
|
-
function buildSummary(profile, profilePath) {
|
|
1905
|
-
return {
|
|
1906
|
-
status: profile.status,
|
|
1907
|
-
profile_path: profilePath,
|
|
1908
|
-
stack: {
|
|
1909
|
-
framework: profile.stack?.framework ?? null,
|
|
1910
|
-
language: profile.stack?.language ?? "unknown",
|
|
1911
|
-
test_runner: profile.stack?.test_runner ?? null,
|
|
1912
|
-
package_manager: profile.stack?.package_manager ?? null,
|
|
1913
|
-
monorepo: !!profile.stack?.monorepo,
|
|
1914
|
-
},
|
|
1915
|
-
file_counts: {
|
|
1916
|
-
critical: profile.file_classifications?.critical.length ?? 0,
|
|
1917
|
-
important: profile.file_classifications?.important.count ?? 0,
|
|
1918
|
-
routine: profile.file_classifications?.routine.count ?? 0,
|
|
1919
|
-
total_analyzed: profile.generation_metadata.files_analyzed,
|
|
1920
|
-
},
|
|
1921
|
-
conventions_summary: buildConventionsSummary(profile),
|
|
1922
|
-
dependency_health: profile.dependency_health ? {
|
|
1923
|
-
total: profile.dependency_health.total,
|
|
1924
|
-
prod: profile.dependency_health.prod,
|
|
1925
|
-
dev: profile.dependency_health.dev,
|
|
1926
|
-
key_count: Object.keys(profile.dependency_health.key_versions).length,
|
|
1927
|
-
} : null,
|
|
1928
|
-
git_health: profile.git_health ?? null,
|
|
1929
|
-
duration_ms: profile.generation_metadata.duration_ms,
|
|
1930
|
-
};
|
|
1931
|
-
}
|
|
1932
|
-
// ---------------------------------------------------------------------------
|
|
1933
347
|
// get_extractor_versions — fast metadata call
|
|
1934
348
|
// ---------------------------------------------------------------------------
|
|
1935
349
|
/**
|