@monoes/monograph 1.5.6 → 1.5.8
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 +31 -15
- package/dist/src/analysis/changed-files.d.ts +3 -0
- package/dist/src/analysis/changed-files.d.ts.map +1 -1
- package/dist/src/analysis/changed-files.js +11 -9
- package/dist/src/analysis/changed-files.js.map +1 -1
- package/dist/src/analysis/changed-workspaces.d.ts.map +1 -1
- package/dist/src/analysis/changed-workspaces.js +2 -9
- package/dist/src/analysis/changed-workspaces.js.map +1 -1
- package/dist/src/analysis/git-changed-files.d.ts +3 -0
- package/dist/src/analysis/git-changed-files.d.ts.map +1 -1
- package/dist/src/analysis/git-changed-files.js +17 -12
- package/dist/src/analysis/git-changed-files.js.map +1 -1
- package/dist/src/analysis/git-ref.d.ts +33 -0
- package/dist/src/analysis/git-ref.d.ts.map +1 -0
- package/dist/src/analysis/git-ref.js +54 -0
- package/dist/src/analysis/git-ref.js.map +1 -0
- package/dist/src/analyze/boundary-analysis.d.ts.map +1 -1
- package/dist/src/analyze/boundary-analysis.js +42 -42
- package/dist/src/analyze/boundary-analysis.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/lsp/server.d.ts +1 -1
- package/dist/src/lsp/server.d.ts.map +1 -1
- package/dist/src/lsp/server.js +48 -13
- package/dist/src/lsp/server.js.map +1 -1
- package/dist/src/mcp-tools/api-impact.d.ts.map +1 -1
- package/dist/src/mcp-tools/api-impact.js +1 -16
- package/dist/src/mcp-tools/api-impact.js.map +1 -1
- package/dist/src/mcp-tools/context.d.ts.map +1 -1
- package/dist/src/mcp-tools/context.js +12 -23
- package/dist/src/mcp-tools/context.js.map +1 -1
- package/dist/src/mcp-tools/explain.d.ts.map +1 -1
- package/dist/src/mcp-tools/explain.js +15 -20
- package/dist/src/mcp-tools/explain.js.map +1 -1
- package/dist/src/mcp-tools/graph-query.d.ts.map +1 -1
- package/dist/src/mcp-tools/graph-query.js +10 -19
- package/dist/src/mcp-tools/graph-query.js.map +1 -1
- package/dist/src/mcp-tools/impact.d.ts.map +1 -1
- package/dist/src/mcp-tools/impact.js +38 -41
- package/dist/src/mcp-tools/impact.js.map +1 -1
- package/dist/src/mcp-tools/neighbors.d.ts.map +1 -1
- package/dist/src/mcp-tools/neighbors.js +4 -22
- package/dist/src/mcp-tools/neighbors.js.map +1 -1
- package/dist/src/mcp-tools/query.d.ts.map +1 -1
- package/dist/src/mcp-tools/query.js +14 -9
- package/dist/src/mcp-tools/query.js.map +1 -1
- package/dist/src/mcp-tools/rename.d.ts.map +1 -1
- package/dist/src/mcp-tools/rename.js +3 -20
- package/dist/src/mcp-tools/rename.js.map +1 -1
- package/dist/src/parsers/c.d.ts.map +1 -1
- package/dist/src/parsers/c.js +12 -0
- package/dist/src/parsers/c.js.map +1 -1
- package/dist/src/parsers/extractor.d.ts.map +1 -1
- package/dist/src/parsers/extractor.js +2 -1
- package/dist/src/parsers/extractor.js.map +1 -1
- package/dist/src/parsers/go.d.ts.map +1 -1
- package/dist/src/parsers/go.js +19 -1
- package/dist/src/parsers/go.js.map +1 -1
- package/dist/src/parsers/language-config.d.ts +4 -0
- package/dist/src/parsers/language-config.d.ts.map +1 -1
- package/dist/src/parsers/language-parsers.d.ts.map +1 -1
- package/dist/src/parsers/language-parsers.js +3 -1
- package/dist/src/parsers/language-parsers.js.map +1 -1
- package/dist/src/parsers/loader.d.ts +1 -0
- package/dist/src/parsers/loader.d.ts.map +1 -1
- package/dist/src/parsers/loader.js +161 -20
- package/dist/src/parsers/loader.js.map +1 -1
- package/dist/src/parsers/python.d.ts.map +1 -1
- package/dist/src/parsers/python.js +6 -0
- package/dist/src/parsers/python.js.map +1 -1
- package/dist/src/parsers/rust.d.ts.map +1 -1
- package/dist/src/parsers/rust.js +10 -0
- package/dist/src/parsers/rust.js.map +1 -1
- package/dist/src/pipeline/orchestrator.d.ts.map +1 -1
- package/dist/src/pipeline/orchestrator.js +17 -0
- package/dist/src/pipeline/orchestrator.js.map +1 -1
- package/dist/src/pipeline/phases/pdf-parse.d.ts.map +1 -1
- package/dist/src/pipeline/phases/pdf-parse.js +10 -11
- package/dist/src/pipeline/phases/pdf-parse.js.map +1 -1
- package/dist/src/storage/edge-store.d.ts +1 -0
- package/dist/src/storage/edge-store.d.ts.map +1 -1
- package/dist/src/storage/edge-store.js +5 -8
- package/dist/src/storage/edge-store.js.map +1 -1
- package/dist/src/storage/node-store.d.ts +1 -0
- package/dist/src/storage/node-store.d.ts.map +1 -1
- package/dist/src/storage/node-store.js +11 -12
- package/dist/src/storage/node-store.js.map +1 -1
- package/dist/src/storage/schema.d.ts.map +1 -1
- package/dist/src/storage/schema.js +6 -0
- package/dist/src/storage/schema.js.map +1 -1
- package/dist/src/storage/utils.d.ts +11 -0
- package/dist/src/storage/utils.d.ts.map +1 -0
- package/dist/src/storage/utils.js +24 -0
- package/dist/src/storage/utils.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +12 -9
- package/.monomind/data/ranked-context.json +0 -5
- package/.monomind/loops/mastermind-review-1782162423447.json +0 -16
- package/.monomind/sessions/session-1777578175215.json +0 -15
- package/.monomind/sessions/session-1777823684507.json +0 -15
- package/.monomind/sessions/session-1777928944749.json +0 -15
- package/.monomind/sessions/session-1778052902210.json +0 -15
- package/.monomind/sessions/session-1778056744636.json +0 -15
- package/.monomind/sessions/session-1778061077599.json +0 -15
- package/.monomind/sessions/session-1778102154764.json +0 -15
- package/__tests__/analysis/shape-extractor.test.ts +0 -124
- package/__tests__/analysis/surprise-scorer.test.ts +0 -154
- package/__tests__/cache/extraction-cache.test.ts +0 -45
- package/__tests__/cli/ai-context.test.ts +0 -175
- package/__tests__/cli/augment.test.ts +0 -128
- package/__tests__/cli/doctor.test.ts +0 -125
- package/__tests__/cli/eval-server.test.ts +0 -89
- package/__tests__/cli/setup.test.ts +0 -178
- package/__tests__/cli/skill-gen.test.ts +0 -280
- package/__tests__/export/formats.test.ts +0 -82
- package/__tests__/fixtures/sample.c +0 -25
- package/__tests__/fixtures/sample.cpp +0 -32
- package/__tests__/fixtures/sample.dart +0 -34
- package/__tests__/fixtures/sample.kt +0 -30
- package/__tests__/fixtures/sample.php +0 -30
- package/__tests__/fixtures/sample.py +0 -11
- package/__tests__/fixtures/sample.rb +0 -26
- package/__tests__/fixtures/sample.swift +0 -42
- package/__tests__/fixtures/sample.ts +0 -17
- package/__tests__/fixtures/sample.vue +0 -40
- package/__tests__/groups/group-search.test.ts +0 -221
- package/__tests__/groups/group-sync.test.ts +0 -336
- package/__tests__/integration/build-atomicity.test.ts +0 -61
- package/__tests__/integration/call-attribution.test.ts +0 -116
- package/__tests__/integration/full-pipeline.test.ts +0 -64
- package/__tests__/integration/graph-report-freshness.test.ts +0 -53
- package/__tests__/integration/incremental-build.test.ts +0 -103
- package/__tests__/mcp-resources/resources.test.ts +0 -256
- package/__tests__/mcp-tools/api-impact.test.ts +0 -188
- package/__tests__/mcp-tools/context.test.ts +0 -130
- package/__tests__/mcp-tools/cypher.test.ts +0 -258
- package/__tests__/mcp-tools/detect-changes.test.ts +0 -114
- package/__tests__/mcp-tools/impact.test.ts +0 -133
- package/__tests__/mcp-tools/rename.test.ts +0 -117
- package/__tests__/mcp-tools/route-map.test.ts +0 -237
- package/__tests__/mcp-tools/shape-check.test.ts +0 -202
- package/__tests__/mcp-tools/tool-map.test.ts +0 -135
- package/__tests__/parsers/c.test.ts +0 -28
- package/__tests__/parsers/cpp.test.ts +0 -28
- package/__tests__/parsers/csharp.test.ts +0 -62
- package/__tests__/parsers/dart.test.ts +0 -28
- package/__tests__/parsers/kotlin.test.ts +0 -28
- package/__tests__/parsers/loader.test.ts +0 -14
- package/__tests__/parsers/php.test.ts +0 -28
- package/__tests__/parsers/python.test.ts +0 -32
- package/__tests__/parsers/ruby.test.ts +0 -33
- package/__tests__/parsers/swift.test.ts +0 -28
- package/__tests__/parsers/typescript.test.ts +0 -45
- package/__tests__/parsers/vue.test.ts +0 -28
- package/__tests__/pipeline/analysis.test.ts +0 -58
- package/__tests__/pipeline/phases/corpus-check.test.ts +0 -26
- package/__tests__/pipeline/phases/evidence.test.ts +0 -41
- package/__tests__/pipeline/phases/field-access.test.ts +0 -22
- package/__tests__/pipeline/phases/leiden.test.ts +0 -72
- package/__tests__/pipeline/phases/markdown.test.ts +0 -84
- package/__tests__/pipeline/phases/middleware-extractor.test.ts +0 -131
- package/__tests__/pipeline/phases/orm.test.ts +0 -379
- package/__tests__/pipeline/phases/processes.test.ts +0 -191
- package/__tests__/pipeline/phases/routes.test.ts +0 -195
- package/__tests__/pipeline/phases/scope-resolution.test.ts +0 -133
- package/__tests__/pipeline/phases/tools.test.ts +0 -161
- package/__tests__/pipeline/phases/variables.test.ts +0 -30
- package/__tests__/pipeline/phases/wildcard-synthesis.test.ts +0 -207
- package/__tests__/pipeline/phases.test.ts +0 -41
- package/__tests__/pipeline/runner.test.ts +0 -28
- package/__tests__/registry/repo-registry.test.ts +0 -127
- package/__tests__/reporting/graph-report.suggest.test.ts +0 -36
- package/__tests__/reporting/graph-report.test.ts +0 -165
- package/__tests__/search/ast-chunker.test.ts +0 -63
- package/__tests__/search/rrf.test.ts +0 -95
- package/__tests__/security/safe-fetch.test.ts +0 -41
- package/__tests__/security/sensitive-files.test.ts +0 -32
- package/__tests__/setup.ts +0 -1
- package/__tests__/skills/platform-skills.test.ts +0 -63
- package/__tests__/staleness/git-staleness.test.ts +0 -107
- package/__tests__/storage/db.test.ts +0 -37
- package/__tests__/storage/evidence-roundtrip.test.ts +0 -89
- package/__tests__/storage/stores.test.ts +0 -165
- package/__tests__/types.test.ts +0 -13
- package/__tests__/validation/extraction-validator.test.ts +0 -48
- package/__tests__/watch/watcher.test.ts +0 -31
- package/__tests__/web/analyze-api.test.ts +0 -66
- package/__tests__/web/api.test.ts +0 -210
- package/__tests__/web/mcp-http.test.ts +0 -67
- package/__tests__/web/react-ui.test.ts +0 -43
- package/__tests__/wiki/gist-publisher.test.ts +0 -66
- package/__tests__/wiki/providers.test.ts +0 -69
- package/__tests__/wiki/wiki-generator.test.ts +0 -260
- package/dist/src/fix/deps.d.ts +0 -14
- package/dist/src/fix/deps.d.ts.map +0 -1
- package/dist/src/fix/deps.js +0 -47
- package/dist/src/fix/deps.js.map +0 -1
- package/dist/src/fix/enum-members.d.ts +0 -20
- package/dist/src/fix/enum-members.d.ts.map +0 -1
- package/dist/src/fix/enum-members.js +0 -95
- package/dist/src/fix/enum-members.js.map +0 -1
- package/dist/src/fix/export-surgery.d.ts +0 -14
- package/dist/src/fix/export-surgery.d.ts.map +0 -1
- package/dist/src/fix/export-surgery.js +0 -140
- package/dist/src/fix/export-surgery.js.map +0 -1
- package/dist/src/fix/exports.d.ts +0 -16
- package/dist/src/fix/exports.d.ts.map +0 -1
- package/dist/src/fix/exports.js +0 -65
- package/dist/src/fix/exports.js.map +0 -1
- package/dist/src/fix/orchestrator.d.ts +0 -28
- package/dist/src/fix/orchestrator.d.ts.map +0 -1
- package/dist/src/fix/orchestrator.js +0 -39
- package/dist/src/fix/orchestrator.js.map +0 -1
- package/src/__tests__/analysis/benchmark.test.ts +0 -59
- package/src/__tests__/analysis/cluster-quality.test.ts +0 -106
- package/src/__tests__/analysis/corpus-health.test.ts +0 -33
- package/src/__tests__/analysis/dependency-health.test.ts +0 -105
- package/src/__tests__/analysis/file-classifier.test.ts +0 -50
- package/src/__tests__/analysis/node-similarity.test.ts +0 -81
- package/src/__tests__/cache/augment-cache.test.ts +0 -55
- package/src/__tests__/cli/check-update.test.ts +0 -42
- package/src/__tests__/cli/hooks-install.test.ts +0 -56
- package/src/__tests__/cli/hooks-marker.test.ts +0 -138
- package/src/__tests__/cli/hooks-status.test.ts +0 -42
- package/src/__tests__/export/adjacency-matrix.test.ts +0 -116
- package/src/__tests__/export/csv.test.ts +0 -39
- package/src/__tests__/export/dot.test.ts +0 -86
- package/src/__tests__/export/gexf.test.ts +0 -78
- package/src/__tests__/export/graphml.test.ts +0 -57
- package/src/__tests__/export/mermaid.test.ts +0 -89
- package/src/__tests__/graph/betweenness.test.ts +0 -89
- package/src/__tests__/graph/cycles.test.ts +0 -131
- package/src/__tests__/graph/dead-code.test.ts +0 -174
- package/src/__tests__/graph/dfs.test.ts +0 -62
- package/src/__tests__/graph/diff-summary.test.ts +0 -83
- package/src/__tests__/graph/edge-filter.test.ts +0 -129
- package/src/__tests__/graph/import-chain.test.ts +0 -111
- package/src/__tests__/graph/merge.test.ts +0 -151
- package/src/__tests__/graph/node-search.test.ts +0 -167
- package/src/__tests__/graph/normalize-id.test.ts +0 -102
- package/src/__tests__/graph/pagerank.test.ts +0 -96
- package/src/__tests__/graph/prune.test.ts +0 -110
- package/src/__tests__/graph/regex-search.test.ts +0 -166
- package/src/__tests__/graph/ripple-impact.test.ts +0 -73
- package/src/__tests__/graph/scc.test.ts +0 -85
- package/src/__tests__/graph/statistics.test.ts +0 -219
- package/src/__tests__/graph/subgraph.test.ts +0 -127
- package/src/__tests__/graph/topo-sort.test.ts +0 -110
- package/src/__tests__/graph/wcc.test.ts +0 -101
- package/src/__tests__/groups/grpc-extractor.test.ts +0 -47
- package/src/__tests__/groups/service-boundary.test.ts +0 -86
- package/src/__tests__/groups/topic-extractor.test.ts +0 -43
- package/src/__tests__/ingest/git-clone.test.ts +0 -128
- package/src/__tests__/ingest/query-memory.test.ts +0 -123
- package/src/__tests__/ingest/transcribe.test.ts +0 -58
- package/src/__tests__/ingest/url-ingest.test.ts +0 -48
- package/src/__tests__/mcp-resources/repo-context-resource.test.ts +0 -37
- package/src/__tests__/mcp-resources/repos-resource.test.ts +0 -71
- package/src/__tests__/mcp-resources/wiki-resource.test.ts +0 -52
- package/src/__tests__/mcp-tools/explain.test.ts +0 -46
- package/src/__tests__/mcp-tools/graph-query.test.ts +0 -45
- package/src/__tests__/mcp-tools/group-sync.test.ts +0 -8
- package/src/__tests__/mcp-tools/impact-filtering.test.ts +0 -48
- package/src/__tests__/mcp-tools/impact.risk.test.ts +0 -24
- package/src/__tests__/mcp-tools/list-repos.test.ts +0 -24
- package/src/__tests__/mcp-tools/neighbors.test.ts +0 -48
- package/src/__tests__/mcp-tools/query.test.ts +0 -42
- package/src/__tests__/parsers/language-parsers.test.ts +0 -52
- package/src/__tests__/parsers/named-bindings.test.ts +0 -73
- package/src/__tests__/pipeline/cluster-only.test.ts +0 -33
- package/src/__tests__/pipeline/phases/bridge-adapters/electron-ipc.test.ts +0 -87
- package/src/__tests__/pipeline/phases/bridge-adapters/tauri.test.ts +0 -116
- package/src/__tests__/pipeline/phases/bridge-adapters/wails.test.ts +0 -81
- package/src/__tests__/pipeline/phases/bridge-resolver.test.ts +0 -110
- package/src/__tests__/pipeline/phases/communities.cohesion.test.ts +0 -43
- package/src/__tests__/pipeline/phases/community-split.test.ts +0 -30
- package/src/__tests__/pipeline/phases/framework-detect.test.ts +0 -65
- package/src/__tests__/pipeline/phases/import-resolver.test.ts +0 -64
- package/src/__tests__/pipeline/phases/parse-arrow.test.ts +0 -33
- package/src/__tests__/pipeline/phases/parse-csharp.test.ts +0 -33
- package/src/__tests__/pipeline/phases/scan.monographignore.test.ts +0 -53
- package/src/__tests__/pipeline/phases/scan.negation.test.ts +0 -40
- package/src/__tests__/pipeline/phases/scope-resolution.go.test.ts +0 -34
- package/src/__tests__/pipeline/phases/scope-resolution.java.test.ts +0 -30
- package/src/__tests__/pipeline/phases/scope-resolution.rust.test.ts +0 -31
- package/src/__tests__/pipeline/phases/suggest-questions.test.ts +0 -46
- package/src/__tests__/pipeline/phases/surprises-scoring.test.ts +0 -46
- package/src/__tests__/pipeline/phases/variables-phase.test.ts +0 -78
- package/src/__tests__/pipeline/phases/wildcard-phase.test.ts +0 -99
- package/src/__tests__/pipeline/runner.parallel.test.ts +0 -78
- package/src/__tests__/reporting/graph-report-confidence.test.ts +0 -43
- package/src/__tests__/reporting/graph-report-gaps.test.ts +0 -41
- package/src/__tests__/scope-resolution/call-sites.test.ts +0 -89
- package/src/__tests__/scope-resolution/evidence-weights.test.ts +0 -49
- package/src/__tests__/search/diacritic.test.ts +0 -23
- package/src/__tests__/security/safe-fetch.test.ts +0 -125
- package/src/__tests__/skills/platform-skills.extra.test.ts +0 -36
- package/src/__tests__/web/api.clusters.test.ts +0 -65
- package/src/__tests__/web/api.file.test.ts +0 -44
- package/src/__tests__/web/api.grep.test.ts +0 -47
- package/src/__tests__/web/api.info.test.ts +0 -18
- package/src/__tests__/web/api.jobs.test.ts +0 -47
- package/src/__tests__/web/api.progress.test.ts +0 -25
- package/src/__tests__/web/api.stream.test.ts +0 -35
- package/src/__tests__/wiki/providers-reasoning.test.ts +0 -46
- package/src/__tests__/wiki/wiki-review-mode.test.ts +0 -22
- package/src/analysis/benchmark.ts +0 -132
- package/src/analysis/changed-files.ts +0 -73
- package/src/analysis/changed-workspaces.ts +0 -94
- package/src/analysis/churn-cache.ts +0 -179
- package/src/analysis/churn-trend.ts +0 -57
- package/src/analysis/churn.ts +0 -263
- package/src/analysis/cluster-quality.ts +0 -142
- package/src/analysis/combined.ts +0 -41
- package/src/analysis/corpus-health.ts +0 -41
- package/src/analysis/coverage-gaps.ts +0 -246
- package/src/analysis/dep-classification.ts +0 -167
- package/src/analysis/dependency-health.ts +0 -146
- package/src/analysis/duplicate-exports.ts +0 -110
- package/src/analysis/fallow-suppression.ts +0 -98
- package/src/analysis/feature-flags-config.ts +0 -47
- package/src/analysis/feature-flags.ts +0 -223
- package/src/analysis/file-classifier.ts +0 -87
- package/src/analysis/git-changed-files.ts +0 -62
- package/src/analysis/health-baseline.ts +0 -80
- package/src/analysis/issue-filters.ts +0 -56
- package/src/analysis/list.ts +0 -74
- package/src/analysis/node-similarity.ts +0 -115
- package/src/analysis/private-type-leaks.ts +0 -119
- package/src/analysis/progress.ts +0 -43
- package/src/analysis/project-state.ts +0 -95
- package/src/analysis/regression-config.ts +0 -36
- package/src/analysis/rule-overrides.ts +0 -81
- package/src/analysis/scripts.ts +0 -95
- package/src/analysis/shape-extractor.ts +0 -202
- package/src/analysis/since-duration.ts +0 -42
- package/src/analysis/suppression-context.ts +0 -95
- package/src/analysis/suppressions.ts +0 -80
- package/src/analysis/surprise-scorer.ts +0 -74
- package/src/analysis/targets.ts +0 -237
- package/src/analysis/unused-class-members.ts +0 -79
- package/src/analysis/workspace-filter.ts +0 -89
- package/src/analyze/boundary-analysis.ts +0 -129
- package/src/analyze/predicates/file.ts +0 -86
- package/src/analyze/predicates/import.ts +0 -90
- package/src/analyze/predicates/lifecycle.ts +0 -55
- package/src/analyze/unused-deps.ts +0 -70
- package/src/analyze/unused-exports.ts +0 -145
- package/src/analyze/unused-files.ts +0 -46
- package/src/api/production-override.ts +0 -63
- package/src/api/programmatic.ts +0 -118
- package/src/audit.ts +0 -234
- package/src/cache/augment-cache.ts +0 -63
- package/src/cache/extraction-cache.ts +0 -141
- package/src/check/filtering.ts +0 -78
- package/src/check/index.ts +0 -99
- package/src/check/output.ts +0 -79
- package/src/check/rules.ts +0 -61
- package/src/ci-template.ts +0 -84
- package/src/claude-cli.ts +0 -59
- package/src/cli/ai-context.ts +0 -193
- package/src/cli/augment.ts +0 -114
- package/src/cli/check-update.ts +0 -40
- package/src/cli/doctor.ts +0 -182
- package/src/cli/eval-server.ts +0 -126
- package/src/cli/hooks-install.ts +0 -202
- package/src/cli/setup.ts +0 -197
- package/src/cli/skill-gen.ts +0 -347
- package/src/commands/flags.ts +0 -72
- package/src/config/boundary-config.ts +0 -183
- package/src/config/cli-schema.ts +0 -81
- package/src/config/config-parsing.ts +0 -102
- package/src/config/duplicates-config.ts +0 -62
- package/src/config/external-plugin.ts +0 -77
- package/src/config/health-config.ts +0 -42
- package/src/config/ignore-exports-used-in-file.ts +0 -46
- package/src/config/migration-types.ts +0 -73
- package/src/config/output-format.ts +0 -24
- package/src/config/plugins/builtin.ts +0 -411
- package/src/config/plugins/registry.ts +0 -77
- package/src/config/plugins/types.ts +0 -14
- package/src/config/resolution.ts +0 -102
- package/src/config/rules.ts +0 -70
- package/src/config/schema-gen.ts +0 -115
- package/src/config/types.ts +0 -149
- package/src/config/used-class-members.ts +0 -53
- package/src/config/validate.ts +0 -108
- package/src/config/workspace.ts +0 -137
- package/src/coverage/cloud-client.ts +0 -111
- package/src/coverage/upload-inventory.ts +0 -84
- package/src/coverage/upload-source-maps.ts +0 -97
- package/src/discover/entry-points.ts +0 -51
- package/src/discover/infrastructure-entries.ts +0 -175
- package/src/duplicates/detect/concatenation.ts +0 -37
- package/src/duplicates/detect/extraction.ts +0 -107
- package/src/duplicates/detect/filtering.ts +0 -112
- package/src/duplicates/detect/lcp.ts +0 -27
- package/src/duplicates/detect/ranking.ts +0 -16
- package/src/duplicates/detect/statistics.ts +0 -69
- package/src/duplicates/detect/suffix-array.ts +0 -88
- package/src/duplicates/families.ts +0 -95
- package/src/duplicates/normalize.ts +0 -58
- package/src/duplicates/shingle-filter.ts +0 -37
- package/src/duplicates/token-types.ts +0 -62
- package/src/duplicates/tokenize/index.ts +0 -104
- package/src/error/fallow-error.ts +0 -94
- package/src/error.ts +0 -47
- package/src/export/adjacency-matrix.ts +0 -127
- package/src/export/analysis-json.ts +0 -87
- package/src/export/badge.ts +0 -105
- package/src/export/canvas.ts +0 -42
- package/src/export/codeclimate.ts +0 -201
- package/src/export/compact-health.ts +0 -119
- package/src/export/compact.ts +0 -83
- package/src/export/csv.ts +0 -33
- package/src/export/cypher.ts +0 -33
- package/src/export/dot.ts +0 -52
- package/src/export/gexf.ts +0 -59
- package/src/export/graphml.ts +0 -50
- package/src/export/html.ts +0 -548
- package/src/export/index.ts +0 -9
- package/src/export/json.ts +0 -36
- package/src/export/markdown.ts +0 -290
- package/src/export/mermaid.ts +0 -100
- package/src/export/obsidian.ts +0 -44
- package/src/export/sarif.ts +0 -245
- package/src/export/svg.ts +0 -68
- package/src/fix/deps.ts +0 -70
- package/src/fix/enum-members.ts +0 -103
- package/src/fix/export-surgery.ts +0 -197
- package/src/fix/exports.ts +0 -93
- package/src/fix/orchestrator.ts +0 -67
- package/src/graph/analyzer.ts +0 -69
- package/src/graph/author-analytics.ts +0 -217
- package/src/graph/baseline.ts +0 -432
- package/src/graph/clone-families.ts +0 -132
- package/src/graph/codeowners-extended.ts +0 -114
- package/src/graph/codeowners-gitlab.ts +0 -150
- package/src/graph/codeowners.ts +0 -217
- package/src/graph/complexity.ts +0 -200
- package/src/graph/cross-reference-findings.ts +0 -85
- package/src/graph/cross-reference.ts +0 -139
- package/src/graph/cycle-detection.ts +0 -311
- package/src/graph/cycles.ts +0 -222
- package/src/graph/dead-code.ts +0 -128
- package/src/graph/dependency-closure.ts +0 -126
- package/src/graph/dfs.ts +0 -118
- package/src/graph/diff.ts +0 -92
- package/src/graph/duplication-stats.ts +0 -79
- package/src/graph/edge-filter.ts +0 -117
- package/src/graph/explain.ts +0 -133
- package/src/graph/external-style-usage.ts +0 -81
- package/src/graph/health-score.ts +0 -179
- package/src/graph/hotspots.ts +0 -219
- package/src/graph/import-chain.ts +0 -148
- package/src/graph/loader.ts +0 -44
- package/src/graph/maintainability.ts +0 -156
- package/src/graph/merge.ts +0 -174
- package/src/graph/mirrored-dirs.ts +0 -202
- package/src/graph/narrowing.ts +0 -92
- package/src/graph/node-search.ts +0 -201
- package/src/graph/node-types.ts +0 -67
- package/src/graph/normalize-id.ts +0 -138
- package/src/graph/pagerank.ts +0 -165
- package/src/graph/prune.ts +0 -95
- package/src/graph/re-exports/propagate.ts +0 -95
- package/src/graph/reachability.ts +0 -99
- package/src/graph/regex-search.ts +0 -232
- package/src/graph/regression.ts +0 -199
- package/src/graph/resolve/discover-types.ts +0 -45
- package/src/graph/resolve/dynamic-imports.ts +0 -102
- package/src/graph/resolve/fallbacks.ts +0 -79
- package/src/graph/resolve/index.ts +0 -68
- package/src/graph/resolve/path-info.ts +0 -41
- package/src/graph/resolve/re-exports.ts +0 -14
- package/src/graph/resolve/react-native.ts +0 -27
- package/src/graph/resolve/require-imports.ts +0 -18
- package/src/graph/resolve/specifier.ts +0 -120
- package/src/graph/resolve/static-imports.ts +0 -14
- package/src/graph/resolve/types.ts +0 -108
- package/src/graph/resolve/upgrades.ts +0 -32
- package/src/graph/ripple-impact.ts +0 -131
- package/src/graph/risk-profile.ts +0 -179
- package/src/graph/statistics.ts +0 -165
- package/src/graph/stats.ts +0 -157
- package/src/graph/subgraph.ts +0 -162
- package/src/graph/topo-sort.ts +0 -171
- package/src/graph/wcc.ts +0 -187
- package/src/groups/contract-bridge.ts +0 -103
- package/src/groups/contract-registry.ts +0 -263
- package/src/groups/group-config.ts +0 -108
- package/src/groups/group-search.ts +0 -139
- package/src/groups/group-sync.ts +0 -82
- package/src/groups/grpc-extractor.ts +0 -64
- package/src/groups/service-boundary.ts +0 -119
- package/src/groups/topic-extractor.ts +0 -90
- package/src/health/analysis-counts-snapshot.ts +0 -57
- package/src/health/analysis-counts.ts +0 -70
- package/src/health/complexity-findings.ts +0 -115
- package/src/health/distribution-thresholds.ts +0 -54
- package/src/health/grouping.ts +0 -138
- package/src/health/health-grouping.ts +0 -86
- package/src/health/health-report-types.ts +0 -165
- package/src/health/health-report.ts +0 -81
- package/src/health/health-score.ts +0 -65
- package/src/health/hotspot-utils.ts +0 -55
- package/src/health/hotspots.ts +0 -104
- package/src/health/large-functions.ts +0 -34
- package/src/health/ownership-metrics.ts +0 -61
- package/src/health/ownership-risk.ts +0 -98
- package/src/health/ownership.ts +0 -174
- package/src/health/quality-gate.ts +0 -57
- package/src/health/risk-profile.ts +0 -39
- package/src/health/runtime-coverage-report.ts +0 -101
- package/src/health/runtime-coverage.ts +0 -71
- package/src/health/scores.ts +0 -72
- package/src/health/scoring-types.ts +0 -48
- package/src/health/target-thresholds.ts +0 -92
- package/src/health/target-types.ts +0 -54
- package/src/health/targets.ts +0 -151
- package/src/health/timings.ts +0 -86
- package/src/health/trend-types.ts +0 -57
- package/src/health/trends.ts +0 -86
- package/src/health/vital-signs-compute.ts +0 -108
- package/src/health/vital-signs-snapshot.ts +0 -72
- package/src/health/vital-signs.ts +0 -101
- package/src/index.ts +0 -111
- package/src/ingest/git-clone.ts +0 -246
- package/src/ingest/query-memory.ts +0 -132
- package/src/ingest/transcribe.ts +0 -254
- package/src/ingest/url-ingest.ts +0 -87
- package/src/init/agent-hooks.ts +0 -86
- package/src/init/git-hooks.ts +0 -71
- package/src/init/project-detection.ts +0 -105
- package/src/license/manager.ts +0 -120
- package/src/lsp/code-actions.ts +0 -127
- package/src/lsp/code-lens.ts +0 -56
- package/src/lsp/diagnostics-ext.ts +0 -150
- package/src/lsp/diagnostics-push.ts +0 -103
- package/src/lsp/diagnostics.ts +0 -98
- package/src/lsp/hover.ts +0 -64
- package/src/lsp/server.ts +0 -254
- package/src/mcp/params.ts +0 -201
- package/src/mcp/resources.ts +0 -124
- package/src/mcp/tool-builders.ts +0 -203
- package/src/mcp-resources/communities-resource.ts +0 -72
- package/src/mcp-resources/graph-resource.ts +0 -14
- package/src/mcp-resources/index.ts +0 -9
- package/src/mcp-resources/named-cluster-resource.ts +0 -35
- package/src/mcp-resources/named-process-resource.ts +0 -26
- package/src/mcp-resources/processes-resource.ts +0 -67
- package/src/mcp-resources/repo-context-resource.ts +0 -36
- package/src/mcp-resources/repos-resource.ts +0 -21
- package/src/mcp-resources/schema-resource.ts +0 -46
- package/src/mcp-resources/wiki-resource.ts +0 -23
- package/src/mcp-tools/api-impact.ts +0 -181
- package/src/mcp-tools/context.ts +0 -111
- package/src/mcp-tools/cypher.ts +0 -29
- package/src/mcp-tools/detect-changes.ts +0 -116
- package/src/mcp-tools/explain.ts +0 -65
- package/src/mcp-tools/graph-query.ts +0 -128
- package/src/mcp-tools/group-list.ts +0 -88
- package/src/mcp-tools/group-query.ts +0 -26
- package/src/mcp-tools/group-sync.ts +0 -32
- package/src/mcp-tools/impact.ts +0 -202
- package/src/mcp-tools/index.ts +0 -21
- package/src/mcp-tools/list-repos.ts +0 -38
- package/src/mcp-tools/neighbors.ts +0 -80
- package/src/mcp-tools/query.ts +0 -86
- package/src/mcp-tools/rename.ts +0 -118
- package/src/mcp-tools/route-map.ts +0 -98
- package/src/mcp-tools/serve.ts +0 -41
- package/src/mcp-tools/shape-check.ts +0 -182
- package/src/mcp-tools/staleness.ts +0 -13
- package/src/mcp-tools/tool-map.ts +0 -66
- package/src/mcp-tools/wiki-build.ts +0 -37
- package/src/mcp-tools/wiki.ts +0 -28
- package/src/migrate/jscpd.ts +0 -78
- package/src/migrate/jsonc-gen.ts +0 -38
- package/src/migrate/knip.ts +0 -126
- package/src/migrate/toml-gen.ts +0 -48
- package/src/parsers/c.ts +0 -31
- package/src/parsers/cpp.ts +0 -29
- package/src/parsers/csharp.ts +0 -43
- package/src/parsers/dart.ts +0 -39
- package/src/parsers/extractor.ts +0 -202
- package/src/parsers/go.ts +0 -27
- package/src/parsers/java.ts +0 -27
- package/src/parsers/kotlin.ts +0 -36
- package/src/parsers/language-config.ts +0 -28
- package/src/parsers/language-parsers.ts +0 -120
- package/src/parsers/loader.ts +0 -149
- package/src/parsers/named-bindings.ts +0 -63
- package/src/parsers/php.ts +0 -37
- package/src/parsers/python.ts +0 -26
- package/src/parsers/ruby.ts +0 -39
- package/src/parsers/rust.ts +0 -25
- package/src/parsers/swift.ts +0 -28
- package/src/parsers/typescript.ts +0 -41
- package/src/parsers/vue.ts +0 -79
- package/src/pipeline/cluster-only.ts +0 -64
- package/src/pipeline/effort.ts +0 -50
- package/src/pipeline/orchestrator.ts +0 -384
- package/src/pipeline/phases/boundary.ts +0 -151
- package/src/pipeline/phases/bridge-adapters/electron-ipc.ts +0 -91
- package/src/pipeline/phases/bridge-adapters/registry.ts +0 -14
- package/src/pipeline/phases/bridge-adapters/tauri.ts +0 -103
- package/src/pipeline/phases/bridge-adapters/types.ts +0 -31
- package/src/pipeline/phases/bridge-adapters/wails.ts +0 -33
- package/src/pipeline/phases/bridge-resolver.ts +0 -77
- package/src/pipeline/phases/call-site-extractors.ts +0 -177
- package/src/pipeline/phases/communities.ts +0 -183
- package/src/pipeline/phases/contextual-proximity.ts +0 -88
- package/src/pipeline/phases/cross-file.ts +0 -116
- package/src/pipeline/phases/docs-parse.ts +0 -307
- package/src/pipeline/phases/evidence.ts +0 -9
- package/src/pipeline/phases/field-access.ts +0 -49
- package/src/pipeline/phases/framework-detect.ts +0 -109
- package/src/pipeline/phases/god-nodes.ts +0 -163
- package/src/pipeline/phases/import-resolver.ts +0 -114
- package/src/pipeline/phases/leiden.ts +0 -77
- package/src/pipeline/phases/llm-extract.ts +0 -178
- package/src/pipeline/phases/markdown.ts +0 -121
- package/src/pipeline/phases/middleware-extractor.ts +0 -127
- package/src/pipeline/phases/module-resolution.ts +0 -294
- package/src/pipeline/phases/mro.ts +0 -56
- package/src/pipeline/phases/orm.ts +0 -503
- package/src/pipeline/phases/parse.ts +0 -222
- package/src/pipeline/phases/pdf-parse.ts +0 -133
- package/src/pipeline/phases/processes.ts +0 -249
- package/src/pipeline/phases/re-export-propagation.ts +0 -160
- package/src/pipeline/phases/reachability.ts +0 -156
- package/src/pipeline/phases/routes.ts +0 -350
- package/src/pipeline/phases/scan.ts +0 -133
- package/src/pipeline/phases/scope-resolution.ts +0 -442
- package/src/pipeline/phases/structure.ts +0 -68
- package/src/pipeline/phases/suggest.ts +0 -92
- package/src/pipeline/phases/surprises.ts +0 -83
- package/src/pipeline/phases/tools.ts +0 -180
- package/src/pipeline/phases/variables-phase.ts +0 -37
- package/src/pipeline/phases/variables.ts +0 -67
- package/src/pipeline/phases/wildcard-phase.ts +0 -50
- package/src/pipeline/phases/wildcard-synthesis.ts +0 -214
- package/src/pipeline/progress.ts +0 -58
- package/src/pipeline/runner.ts +0 -88
- package/src/pipeline/types.ts +0 -41
- package/src/query/cypher-parser.ts +0 -450
- package/src/registry/repo-registry.ts +0 -125
- package/src/regression/baseline-deltas.ts +0 -215
- package/src/regression/baseline.ts +0 -76
- package/src/regression/counts.ts +0 -87
- package/src/regression/outcome.ts +0 -78
- package/src/regression/tolerance.ts +0 -35
- package/src/report/attributed-duplication.ts +0 -112
- package/src/report/badge-svg.ts +0 -100
- package/src/report/cross-ref-human.ts +0 -50
- package/src/report/duplication-grouping.ts +0 -74
- package/src/report/grouping.ts +0 -137
- package/src/report/human-check.ts +0 -291
- package/src/report/human-dupes.ts +0 -142
- package/src/report/human-health.ts +0 -195
- package/src/report/human.ts +0 -120
- package/src/report/json-actions.ts +0 -91
- package/src/report/json-builders.ts +0 -70
- package/src/report/json-schema.ts +0 -75
- package/src/report/number-format.ts +0 -91
- package/src/report/output-grouped.ts +0 -102
- package/src/report/pipeline-perf.ts +0 -56
- package/src/report/trace-human.ts +0 -127
- package/src/reporting/graph-report.ts +0 -431
- package/src/results/fallow-results.ts +0 -152
- package/src/results/types.ts +0 -149
- package/src/scope-resolution/evidence-weights.ts +0 -41
- package/src/search/ast-chunker.ts +0 -206
- package/src/search/diacritic.ts +0 -7
- package/src/search/hybrid-query.ts +0 -65
- package/src/search/rrf.ts +0 -51
- package/src/security/safe-fetch.ts +0 -113
- package/src/security/sensitive-files.ts +0 -24
- package/src/skills/platform-skills.ts +0 -233
- package/src/staleness/git-staleness.ts +0 -66
- package/src/storage/db.ts +0 -110
- package/src/storage/edge-store.ts +0 -103
- package/src/storage/file-cache.ts +0 -78
- package/src/storage/fts-store.ts +0 -385
- package/src/storage/node-store.ts +0 -209
- package/src/storage/schema.ts +0 -171
- package/src/storage/suppressions.ts +0 -145
- package/src/storage/unlinked-refs.ts +0 -117
- package/src/types.ts +0 -197
- package/src/validation/extraction-validator.ts +0 -54
- package/src/watch/watcher.ts +0 -160
- package/src/web/analyze-api.ts +0 -146
- package/src/web/api.ts +0 -584
- package/src/web/async-jobs.ts +0 -109
- package/src/web/mcp-http.ts +0 -227
- package/src/web/react-ui.ts +0 -78
- package/src/web/server.ts +0 -90
- package/src/web/ui/index.html +0 -204
- package/src/wiki/gist-publisher.ts +0 -76
- package/src/wiki/prompt-builder.ts +0 -35
- package/src/wiki/providers.ts +0 -134
- package/src/wiki/wiki-generator.ts +0 -223
- package/src/wiki/wiki-store.ts +0 -49
- package/tsconfig.json +0 -11
- package/vitest.config.ts +0 -20
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
import type { PipelinePhase, PipelineContext } from '../types.js';
|
|
2
|
-
import { makeId, CONFIDENCE_SCORE } from '../../types.js';
|
|
3
|
-
import { insertEdges } from '../../storage/edge-store.js';
|
|
4
|
-
import type Database from 'better-sqlite3';
|
|
5
|
-
|
|
6
|
-
export interface ReExportPropagationOutput {
|
|
7
|
-
propagated: number;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Fixed-point re-export chain propagation.
|
|
12
|
-
*
|
|
13
|
-
* After the graph is built, barrel files (index.ts that re-export from sub-modules)
|
|
14
|
-
* create RE_EXPORTS edges pointing to the files they re-export from. A file is
|
|
15
|
-
* "reachable" if:
|
|
16
|
-
* (a) it has a direct IMPORTS edge targeting one of its symbols or its File node, OR
|
|
17
|
-
* (b) it is re-exported by a barrel file that is itself reachable (transitively).
|
|
18
|
-
*
|
|
19
|
-
* This prevents false "unreachable" reports for exports behind barrel files.
|
|
20
|
-
*
|
|
21
|
-
* Algorithm: iterative BFS until no new propagations (fixed-point).
|
|
22
|
-
*/
|
|
23
|
-
export function propagateReExports(db: Database.Database): ReExportPropagationOutput {
|
|
24
|
-
// Collect all RE_EXPORTS edges (barrel file → re-exported file), keyed by File node IDs
|
|
25
|
-
const reExportEdges = db.prepare(
|
|
26
|
-
`SELECT source_id, target_id FROM edges WHERE relation = 'RE_EXPORTS'`,
|
|
27
|
-
).all() as { source_id: string; target_id: string }[];
|
|
28
|
-
|
|
29
|
-
if (reExportEdges.length === 0) return { propagated: 0 };
|
|
30
|
-
|
|
31
|
-
// Build map: barrelFileId → Set<reExportedFileId>
|
|
32
|
-
const barrelExports = new Map<string, Set<string>>();
|
|
33
|
-
for (const e of reExportEdges) {
|
|
34
|
-
if (!barrelExports.has(e.source_id)) barrelExports.set(e.source_id, new Set());
|
|
35
|
-
barrelExports.get(e.source_id)!.add(e.target_id);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// Determine which File nodes are "reached" — either directly imported (via their File node ID)
|
|
39
|
-
// or their symbols are imported (join through nodes.file_path).
|
|
40
|
-
// We build a set of reached file paths to handle both IMPORTS→symbol and IMPORTS→File cases.
|
|
41
|
-
const reachedFilePaths = new Set<string>(
|
|
42
|
-
(db.prepare(`
|
|
43
|
-
SELECT DISTINCT n.file_path
|
|
44
|
-
FROM edges e
|
|
45
|
-
JOIN nodes n ON n.id = e.target_id
|
|
46
|
-
WHERE e.relation = 'IMPORTS'
|
|
47
|
-
AND n.file_path IS NOT NULL
|
|
48
|
-
`).all() as { file_path: string }[]).map(r => r.file_path),
|
|
49
|
-
);
|
|
50
|
-
|
|
51
|
-
// Also map File node ID → file_path for barrel lookup
|
|
52
|
-
const fileIdToPath = new Map<string, string>(
|
|
53
|
-
(db.prepare(`SELECT id, file_path FROM nodes WHERE label = 'File' AND file_path IS NOT NULL`).all() as
|
|
54
|
-
{ id: string; file_path: string }[]).map(r => [r.id, r.file_path]),
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
// Map file_path → File node ID for inserting synthetic IMPORTS edges
|
|
58
|
-
const filePathToId = new Map<string, string>();
|
|
59
|
-
for (const [id, path] of fileIdToPath) filePathToId.set(path, id);
|
|
60
|
-
|
|
61
|
-
// Prepare insert for synthetic IMPORTS edge: importer_file → re-exported_file (File node)
|
|
62
|
-
const insertEdge = db.prepare(`
|
|
63
|
-
INSERT OR IGNORE INTO edges (id, source_id, target_id, relation, confidence, confidence_score, weight)
|
|
64
|
-
VALUES (?, ?, ?, 'IMPORTS', 'INFERRED', ?, 1.0)
|
|
65
|
-
`);
|
|
66
|
-
|
|
67
|
-
const addPropagated = db.transaction(
|
|
68
|
-
(toAdd: Array<{ importerFileId: string; targetFileId: string; targetFilePath: string }>) => {
|
|
69
|
-
for (const { importerFileId, targetFileId, targetFilePath } of toAdd) {
|
|
70
|
-
const edgeId = makeId(importerFileId, targetFileId, 'reexport_propagated');
|
|
71
|
-
insertEdge.run(edgeId, importerFileId, targetFileId, CONFIDENCE_SCORE.INFERRED);
|
|
72
|
-
reachedFilePaths.add(targetFilePath);
|
|
73
|
-
}
|
|
74
|
-
},
|
|
75
|
-
);
|
|
76
|
-
|
|
77
|
-
// ── Preload: avoid per-iteration DB queries inside the BFS while-loop ─────────
|
|
78
|
-
|
|
79
|
-
// nodeId → file_path for all nodes (used to resolve importer file paths)
|
|
80
|
-
const nodeIdToFilePath = new Map<string, string>(
|
|
81
|
-
(db.prepare(`SELECT id, file_path FROM nodes WHERE file_path IS NOT NULL`)
|
|
82
|
-
.all() as { id: string; file_path: string }[]).map(r => [r.id, r.file_path]),
|
|
83
|
-
);
|
|
84
|
-
|
|
85
|
-
// barrelFilePath → Set<importerNodeId>: who IMPORTS any node from each barrel file
|
|
86
|
-
// Load all IMPORTS edges once and group by target file_path
|
|
87
|
-
const allImportEdges = db.prepare(`
|
|
88
|
-
SELECT e.source_id, n.file_path AS target_file_path
|
|
89
|
-
FROM edges e
|
|
90
|
-
JOIN nodes n ON n.id = e.target_id
|
|
91
|
-
WHERE e.relation = 'IMPORTS'
|
|
92
|
-
AND n.file_path IS NOT NULL
|
|
93
|
-
`).all() as { source_id: string; target_file_path: string }[];
|
|
94
|
-
|
|
95
|
-
const barrelImporters = new Map<string, Set<string>>();
|
|
96
|
-
for (const row of allImportEdges) {
|
|
97
|
-
let s = barrelImporters.get(row.target_file_path);
|
|
98
|
-
if (!s) {
|
|
99
|
-
s = new Set();
|
|
100
|
-
barrelImporters.set(row.target_file_path, s);
|
|
101
|
-
}
|
|
102
|
-
s.add(row.source_id);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// ── BFS fixed-point (all lookups now O(1) from preloaded maps) ────────────────
|
|
106
|
-
|
|
107
|
-
let totalPropagated = 0;
|
|
108
|
-
let changed = true;
|
|
109
|
-
|
|
110
|
-
while (changed) {
|
|
111
|
-
changed = false;
|
|
112
|
-
const toAdd: Array<{ importerFileId: string; targetFileId: string; targetFilePath: string }> = [];
|
|
113
|
-
|
|
114
|
-
for (const [barrelFileId, exportedFileIds] of barrelExports) {
|
|
115
|
-
const barrelFilePath = fileIdToPath.get(barrelFileId);
|
|
116
|
-
if (!barrelFilePath || !reachedFilePaths.has(barrelFilePath)) continue;
|
|
117
|
-
|
|
118
|
-
// O(1) lookup instead of per-barrel DB query
|
|
119
|
-
const importerNodeIds = barrelImporters.get(barrelFilePath);
|
|
120
|
-
if (!importerNodeIds) continue;
|
|
121
|
-
|
|
122
|
-
for (const importerNodeId of importerNodeIds) {
|
|
123
|
-
// O(1) lookup instead of per-importer DB query
|
|
124
|
-
const importerFilePath = nodeIdToFilePath.get(importerNodeId);
|
|
125
|
-
if (!importerFilePath) continue;
|
|
126
|
-
|
|
127
|
-
const importerFileId = filePathToId.get(importerFilePath);
|
|
128
|
-
if (!importerFileId) continue;
|
|
129
|
-
|
|
130
|
-
for (const targetFileId of exportedFileIds) {
|
|
131
|
-
const targetFilePath = fileIdToPath.get(targetFileId);
|
|
132
|
-
if (!targetFilePath) continue;
|
|
133
|
-
|
|
134
|
-
if (!reachedFilePaths.has(targetFilePath)) {
|
|
135
|
-
toAdd.push({ importerFileId, targetFileId, targetFilePath });
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
if (toAdd.length > 0) {
|
|
142
|
-
addPropagated(toAdd);
|
|
143
|
-
totalPropagated += toAdd.length;
|
|
144
|
-
changed = true;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
return { propagated: totalPropagated };
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
export const reExportPropagationPhase: PipelinePhase<ReExportPropagationOutput> = {
|
|
152
|
-
name: 're-export-propagation',
|
|
153
|
-
deps: ['cross-file'],
|
|
154
|
-
async execute(ctx): Promise<ReExportPropagationOutput> {
|
|
155
|
-
if (!ctx.db) return { propagated: 0 };
|
|
156
|
-
const result = propagateReExports(ctx.db);
|
|
157
|
-
ctx.onProgress?.({ phase: 're-export-propagation', message: `Propagated ${result.propagated} re-export edges` });
|
|
158
|
-
return result;
|
|
159
|
-
},
|
|
160
|
-
};
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
import type Database from 'better-sqlite3';
|
|
2
|
-
|
|
3
|
-
export type ReachabilityRole = 'runtime' | 'test' | 'support' | 'unreachable';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Classify every File node's reachability role.
|
|
7
|
-
*
|
|
8
|
-
* Entry point detection:
|
|
9
|
-
* - Test entry points: files matching test patterns (*.test.*, *.spec.*, __tests__/*)
|
|
10
|
-
* - Runtime entry points: files with no incoming IMPORTS edges (potential roots)
|
|
11
|
-
* - Support files: *.config.*, scripts/*, tools/* etc.
|
|
12
|
-
*
|
|
13
|
-
* BFS propagation (forward — follows what files import):
|
|
14
|
-
* - From test entry points: mark reachable files as 'test'
|
|
15
|
-
* - From runtime entry points: mark reachable files as 'runtime'
|
|
16
|
-
* - Files reachable from both: 'runtime' wins over 'test'
|
|
17
|
-
* - Nodes reachable from neither: marked 'unreachable'
|
|
18
|
-
* - Config/support files (*.config.*, scripts/*): marked 'support'
|
|
19
|
-
*/
|
|
20
|
-
export function classifyReachability(
|
|
21
|
-
db: Database.Database,
|
|
22
|
-
_projectDir: string,
|
|
23
|
-
): { runtime: number; test: number; support: number; unreachable: number } {
|
|
24
|
-
const TEST_PATTERNS = [
|
|
25
|
-
/\.test\.[tj]sx?$/,
|
|
26
|
-
/\.spec\.[tj]sx?$/,
|
|
27
|
-
/__tests__\//,
|
|
28
|
-
/\/test\//,
|
|
29
|
-
/\/tests\//,
|
|
30
|
-
];
|
|
31
|
-
const SUPPORT_PATTERNS = [
|
|
32
|
-
/\.config\.[tj]sx?$/,
|
|
33
|
-
/\/scripts\//,
|
|
34
|
-
/\/tools\//,
|
|
35
|
-
/jest\.config/,
|
|
36
|
-
/vitest\.config/,
|
|
37
|
-
/webpack\.config/,
|
|
38
|
-
/vite\.config/,
|
|
39
|
-
];
|
|
40
|
-
|
|
41
|
-
const allFileNodes = db.prepare(
|
|
42
|
-
`SELECT id, file_path, properties FROM nodes WHERE label = 'File' AND file_path IS NOT NULL`,
|
|
43
|
-
).all() as { id: string; file_path: string; properties: string | null }[];
|
|
44
|
-
|
|
45
|
-
const roleMap = new Map<string, ReachabilityRole>();
|
|
46
|
-
const testEntryIds = new Set<string>();
|
|
47
|
-
const runtimeEntryIds = new Set<string>();
|
|
48
|
-
|
|
49
|
-
// Initial classification by path pattern
|
|
50
|
-
for (const node of allFileNodes) {
|
|
51
|
-
const fp = node.file_path;
|
|
52
|
-
if (TEST_PATTERNS.some(p => p.test(fp))) {
|
|
53
|
-
testEntryIds.add(node.id);
|
|
54
|
-
roleMap.set(node.id, 'test');
|
|
55
|
-
} else if (SUPPORT_PATTERNS.some(p => p.test(fp))) {
|
|
56
|
-
roleMap.set(node.id, 'support');
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Files with no incoming IMPORTS edges are potential runtime roots
|
|
61
|
-
const noIncoming = db.prepare(`
|
|
62
|
-
SELECT n.id FROM nodes n
|
|
63
|
-
WHERE n.label = 'File'
|
|
64
|
-
AND NOT EXISTS (
|
|
65
|
-
SELECT 1 FROM edges e WHERE e.target_id = n.id AND e.relation = 'IMPORTS'
|
|
66
|
-
)
|
|
67
|
-
`).all() as { id: string }[];
|
|
68
|
-
|
|
69
|
-
for (const { id } of noIncoming) {
|
|
70
|
-
if (!roleMap.has(id)) {
|
|
71
|
-
runtimeEntryIds.add(id);
|
|
72
|
-
roleMap.set(id, 'runtime');
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// ── Preload forward adjacency map for BFS (one query vs N per BFS node) ────────
|
|
77
|
-
const forwardEdges = new Map<string, string[]>();
|
|
78
|
-
const fwdRows = db.prepare(
|
|
79
|
-
`SELECT source_id, target_id FROM edges WHERE relation IN ('IMPORTS', 'RE_EXPORTS')`,
|
|
80
|
-
).all() as { source_id: string; target_id: string }[];
|
|
81
|
-
for (const row of fwdRows) {
|
|
82
|
-
let targets = forwardEdges.get(row.source_id);
|
|
83
|
-
if (!targets) {
|
|
84
|
-
targets = [];
|
|
85
|
-
forwardEdges.set(row.source_id, targets);
|
|
86
|
-
}
|
|
87
|
-
targets.push(row.target_id);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// ── BFS from entry points — uses preloaded adjacency (no per-node DB query) ──
|
|
91
|
-
const bfs = (startIds: Set<string>, role: ReachabilityRole) => {
|
|
92
|
-
const queue = Array.from(startIds);
|
|
93
|
-
const visited = new Set(startIds);
|
|
94
|
-
while (queue.length > 0) {
|
|
95
|
-
const nodeId = queue.shift()!;
|
|
96
|
-
// O(1) adjacency lookup instead of per-node DB query
|
|
97
|
-
const targets = forwardEdges.get(nodeId);
|
|
98
|
-
if (!targets) continue;
|
|
99
|
-
for (const target_id of targets) {
|
|
100
|
-
if (!visited.has(target_id)) {
|
|
101
|
-
visited.add(target_id);
|
|
102
|
-
// Set role only if not already set to a higher-priority role
|
|
103
|
-
// Priority: runtime > test > support > unreachable
|
|
104
|
-
const existing = roleMap.get(target_id);
|
|
105
|
-
if (!existing || existing === 'unreachable' || (role === 'runtime' && existing === 'test')) {
|
|
106
|
-
roleMap.set(target_id, role);
|
|
107
|
-
}
|
|
108
|
-
queue.push(target_id);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
// Test BFS first, then runtime (runtime wins on overlap)
|
|
115
|
-
bfs(testEntryIds, 'test');
|
|
116
|
-
bfs(runtimeEntryIds, 'runtime');
|
|
117
|
-
|
|
118
|
-
// ── Persist roles and count — batch UPDATE in transaction ────────────────────
|
|
119
|
-
const updateStmt = db.prepare(`UPDATE nodes SET properties = ? WHERE id = ?`);
|
|
120
|
-
const persistAll = db.transaction(() => {
|
|
121
|
-
let runtime = 0, test = 0, support = 0, unreachable = 0;
|
|
122
|
-
for (const node of allFileNodes) {
|
|
123
|
-
const role = roleMap.get(node.id) ?? 'unreachable';
|
|
124
|
-
let props: Record<string, unknown> = {};
|
|
125
|
-
try {
|
|
126
|
-
if (node.properties) props = JSON.parse(node.properties);
|
|
127
|
-
} catch { /* ignore parse errors */ }
|
|
128
|
-
props.reachabilityRole = role;
|
|
129
|
-
updateStmt.run(JSON.stringify(props), node.id);
|
|
130
|
-
if (role === 'runtime') runtime++;
|
|
131
|
-
else if (role === 'test') test++;
|
|
132
|
-
else if (role === 'support') support++;
|
|
133
|
-
else unreachable++;
|
|
134
|
-
}
|
|
135
|
-
return { runtime, test, support, unreachable };
|
|
136
|
-
});
|
|
137
|
-
return persistAll();
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* Get File nodes filtered by reachability role.
|
|
142
|
-
*/
|
|
143
|
-
export function getNodesByReachabilityRole(
|
|
144
|
-
db: Database.Database,
|
|
145
|
-
role: ReachabilityRole,
|
|
146
|
-
limit = 100,
|
|
147
|
-
): Array<{ id: string; name: string; filePath: string | null }> {
|
|
148
|
-
const rows = db.prepare(`
|
|
149
|
-
SELECT id, name, file_path
|
|
150
|
-
FROM nodes
|
|
151
|
-
WHERE label = 'File'
|
|
152
|
-
AND json_extract(properties, '$.reachabilityRole') = ?
|
|
153
|
-
LIMIT ?
|
|
154
|
-
`).all(role, limit) as { id: string; name: string; file_path: string | null }[];
|
|
155
|
-
return rows.map(r => ({ id: r.id, name: r.name, filePath: r.file_path }));
|
|
156
|
-
}
|
|
@@ -1,350 +0,0 @@
|
|
|
1
|
-
import { readFileSync, statSync } from 'fs';
|
|
2
|
-
import { extname } from 'path';
|
|
3
|
-
import type { PipelinePhase } from '../types.js';
|
|
4
|
-
import type { MonographNode, MonographEdge } from '../../types.js';
|
|
5
|
-
import { makeId, toNormLabel } from '../../types.js';
|
|
6
|
-
import { insertNodes } from '../../storage/node-store.js';
|
|
7
|
-
import { insertEdges } from '../../storage/edge-store.js';
|
|
8
|
-
import type { StructureOutput } from './structure.js';
|
|
9
|
-
|
|
10
|
-
// ── Constants ─────────────────────────────────────────────────────────────────
|
|
11
|
-
|
|
12
|
-
const CODE_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs']);
|
|
13
|
-
|
|
14
|
-
// Next.js pages dir (classic router)
|
|
15
|
-
const PAGES_RE = /^(?:src\/)?pages\//;
|
|
16
|
-
// Next.js app router route files — support both project root and src/ layout
|
|
17
|
-
const APP_ROUTE_RE = /^(?:src\/)?app\/(.*\/)?route\.(ts|tsx|js|jsx)$/;
|
|
18
|
-
|
|
19
|
-
// Express/Fastify route methods
|
|
20
|
-
const EXPRESS_METHODS = ['get', 'post', 'put', 'delete', 'patch', 'use'] as const;
|
|
21
|
-
type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'ANY';
|
|
22
|
-
|
|
23
|
-
// ── Output types ──────────────────────────────────────────────────────────────
|
|
24
|
-
|
|
25
|
-
export interface RouteEntry {
|
|
26
|
-
method: string;
|
|
27
|
-
path: string;
|
|
28
|
-
handlerNodeId?: string;
|
|
29
|
-
filePath: string;
|
|
30
|
-
routeNodeId: string;
|
|
31
|
-
middlewareChain: string[];
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export interface RoutesOutput {
|
|
35
|
-
routeRegistry: RouteEntry[];
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// ── Phase ─────────────────────────────────────────────────────────────────────
|
|
39
|
-
|
|
40
|
-
export const routesPhase: PipelinePhase<RoutesOutput> = {
|
|
41
|
-
name: 'routes',
|
|
42
|
-
deps: ['parse', 'structure'],
|
|
43
|
-
async execute(ctx, deps) {
|
|
44
|
-
if (ctx.allFilesCached) return { routeRegistry: [], routeNodes: [], handlesEdges: [] };
|
|
45
|
-
const { fileNodes } = deps.get('structure') as StructureOutput;
|
|
46
|
-
const routeRegistry: RouteEntry[] = [];
|
|
47
|
-
const routeNodes: MonographNode[] = [];
|
|
48
|
-
const handlesEdges: MonographEdge[] = [];
|
|
49
|
-
|
|
50
|
-
// ── Preload handler index: name:filePath → nodeId (one DB query vs N per route) ──
|
|
51
|
-
// Keyed as `${name}\0${filePath}` for O(1) lookup during route extraction.
|
|
52
|
-
const handlerIndex = new Map<string, string>();
|
|
53
|
-
if (ctx.db) {
|
|
54
|
-
const handlerRows = ctx.db
|
|
55
|
-
.prepare(`SELECT id, name, file_path FROM nodes WHERE file_path IS NOT NULL`)
|
|
56
|
-
.all() as { id: string; name: string; file_path: string }[];
|
|
57
|
-
for (const row of handlerRows) {
|
|
58
|
-
handlerIndex.set(`${row.name}\0${row.file_path}`, row.id);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/** O(1) handler lookup using the preloaded index */
|
|
63
|
-
function lookupHandler(handlerName: string, filePath: string): string | undefined {
|
|
64
|
-
return handlerIndex.get(`${handlerName}\0${filePath}`);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
for (const fileNode of fileNodes) {
|
|
68
|
-
const relPath = fileNode.filePath ?? '';
|
|
69
|
-
const ext = extname(relPath).toLowerCase();
|
|
70
|
-
|
|
71
|
-
if (!CODE_EXTENSIONS.has(ext)) continue;
|
|
72
|
-
|
|
73
|
-
// ── 1. Next.js file-based routing ──────────────────────────────────────
|
|
74
|
-
const isNextPages = PAGES_RE.test(relPath);
|
|
75
|
-
const isNextAppRoute = APP_ROUTE_RE.test(relPath);
|
|
76
|
-
|
|
77
|
-
if (isNextPages || isNextAppRoute) {
|
|
78
|
-
const routePath = isNextPages
|
|
79
|
-
? pagesPathToRoute(relPath)
|
|
80
|
-
: appPathToRoute(relPath);
|
|
81
|
-
const method = 'ANY';
|
|
82
|
-
const routeNodeId = makeId('route', method, routePath, relPath);
|
|
83
|
-
const name = `${method} ${routePath}`;
|
|
84
|
-
|
|
85
|
-
const routeNode: MonographNode = {
|
|
86
|
-
id: routeNodeId,
|
|
87
|
-
label: 'Route',
|
|
88
|
-
name,
|
|
89
|
-
normLabel: toNormLabel(name),
|
|
90
|
-
filePath: relPath,
|
|
91
|
-
startLine: 0,
|
|
92
|
-
endLine: 0,
|
|
93
|
-
isExported: false,
|
|
94
|
-
language: langFromExt(ext),
|
|
95
|
-
};
|
|
96
|
-
routeNodes.push(routeNode);
|
|
97
|
-
|
|
98
|
-
const entry: RouteEntry = { method, path: routePath, filePath: relPath, routeNodeId, middlewareChain: [] };
|
|
99
|
-
|
|
100
|
-
if (ctx.db) {
|
|
101
|
-
const source = safeReadSource(`${ctx.repoPath}/${relPath}`, ctx.options.maxFileSizeBytes);
|
|
102
|
-
if (source) {
|
|
103
|
-
const handlerName = extractDefaultExportName(source);
|
|
104
|
-
if (handlerName) {
|
|
105
|
-
const targetId = lookupHandler(handlerName, relPath);
|
|
106
|
-
if (targetId) {
|
|
107
|
-
const edgeId = makeId(routeNodeId, targetId, 'handles_route');
|
|
108
|
-
handlesEdges.push({
|
|
109
|
-
id: edgeId,
|
|
110
|
-
sourceId: routeNodeId,
|
|
111
|
-
targetId,
|
|
112
|
-
relation: 'HANDLES_ROUTE',
|
|
113
|
-
confidence: 'EXTRACTED',
|
|
114
|
-
confidenceScore: 0.9,
|
|
115
|
-
});
|
|
116
|
-
entry.handlerNodeId = targetId;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
routeRegistry.push(entry);
|
|
123
|
-
continue;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// ── 2. Express / Fastify app.METHOD() style ────────────────────────────
|
|
127
|
-
const source = safeReadSource(`${ctx.repoPath}/${relPath}`, ctx.options.maxFileSizeBytes);
|
|
128
|
-
if (!source) continue;
|
|
129
|
-
|
|
130
|
-
const expressEntries = extractExpressRoutes(source, relPath, ext);
|
|
131
|
-
for (const e of expressEntries) {
|
|
132
|
-
const routeNodeId = makeId('route', e.method, e.path, relPath);
|
|
133
|
-
const name = `${e.method} ${e.path}`;
|
|
134
|
-
const routeNode: MonographNode = {
|
|
135
|
-
id: routeNodeId,
|
|
136
|
-
label: 'Route',
|
|
137
|
-
name,
|
|
138
|
-
normLabel: toNormLabel(name),
|
|
139
|
-
filePath: relPath,
|
|
140
|
-
startLine: 0,
|
|
141
|
-
endLine: 0,
|
|
142
|
-
isExported: false,
|
|
143
|
-
language: langFromExt(ext),
|
|
144
|
-
};
|
|
145
|
-
routeNodes.push(routeNode);
|
|
146
|
-
|
|
147
|
-
const entry: RouteEntry = { method: e.method, path: e.path, filePath: relPath, routeNodeId, middlewareChain: [] };
|
|
148
|
-
|
|
149
|
-
if (ctx.db && e.handlerName) {
|
|
150
|
-
const targetId = lookupHandler(e.handlerName, relPath);
|
|
151
|
-
if (targetId) {
|
|
152
|
-
const edgeId = makeId(routeNodeId, targetId, 'handles_route');
|
|
153
|
-
handlesEdges.push({
|
|
154
|
-
id: edgeId,
|
|
155
|
-
sourceId: routeNodeId,
|
|
156
|
-
targetId,
|
|
157
|
-
relation: 'HANDLES_ROUTE',
|
|
158
|
-
confidence: 'EXTRACTED',
|
|
159
|
-
confidenceScore: 0.9,
|
|
160
|
-
});
|
|
161
|
-
entry.handlerNodeId = targetId;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
routeRegistry.push(entry);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// ── 3. NestJS / TypeScript decorator routing ───────────────────────────
|
|
169
|
-
const nestEntries = extractNestRoutes(source, relPath, ext);
|
|
170
|
-
for (const e of nestEntries) {
|
|
171
|
-
const routeNodeId = makeId('route', e.method, e.path, relPath);
|
|
172
|
-
const name = `${e.method} ${e.path}`;
|
|
173
|
-
const routeNode: MonographNode = {
|
|
174
|
-
id: routeNodeId,
|
|
175
|
-
label: 'Route',
|
|
176
|
-
name,
|
|
177
|
-
normLabel: toNormLabel(name),
|
|
178
|
-
filePath: relPath,
|
|
179
|
-
startLine: 0,
|
|
180
|
-
endLine: 0,
|
|
181
|
-
isExported: false,
|
|
182
|
-
language: langFromExt(ext),
|
|
183
|
-
};
|
|
184
|
-
routeNodes.push(routeNode);
|
|
185
|
-
|
|
186
|
-
const entry: RouteEntry = { method: e.method, path: e.path, filePath: relPath, routeNodeId, middlewareChain: [] };
|
|
187
|
-
|
|
188
|
-
if (ctx.db && e.handlerName) {
|
|
189
|
-
const targetId = lookupHandler(e.handlerName, relPath);
|
|
190
|
-
if (targetId) {
|
|
191
|
-
const edgeId = makeId(routeNodeId, targetId, 'handles_route');
|
|
192
|
-
handlesEdges.push({
|
|
193
|
-
id: edgeId,
|
|
194
|
-
sourceId: routeNodeId,
|
|
195
|
-
targetId,
|
|
196
|
-
relation: 'HANDLES_ROUTE',
|
|
197
|
-
confidence: 'EXTRACTED',
|
|
198
|
-
confidenceScore: 0.9,
|
|
199
|
-
});
|
|
200
|
-
entry.handlerNodeId = targetId;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
routeRegistry.push(entry);
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
if (ctx.db) {
|
|
209
|
-
insertNodes(ctx.db, routeNodes);
|
|
210
|
-
insertEdges(ctx.db, handlesEdges);
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
return { routeRegistry };
|
|
214
|
-
},
|
|
215
|
-
};
|
|
216
|
-
|
|
217
|
-
// ── Path conversion helpers ───────────────────────────────────────────────────
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* Convert a pages/... file path to an HTTP route path.
|
|
221
|
-
* examples:
|
|
222
|
-
* pages/index.ts → /
|
|
223
|
-
* pages/about.ts → /about
|
|
224
|
-
* pages/api/users.ts → /api/users
|
|
225
|
-
* pages/api/users/[id].ts → /api/users/:id
|
|
226
|
-
* pages/[[...slug]].ts → *
|
|
227
|
-
*/
|
|
228
|
-
export function pagesPathToRoute(relPath: string): string {
|
|
229
|
-
// strip leading 'pages/' and extension
|
|
230
|
-
let path = relPath.replace(/^pages\//, '').replace(/\.(tsx?|jsx?)$/, '');
|
|
231
|
-
// Remove trailing /index
|
|
232
|
-
path = path.replace(/(^|\/)index$/, '');
|
|
233
|
-
// catch-all: [[...param]] or [...param]
|
|
234
|
-
path = path.replace(/\[\[\.\.\.(\w+)\]\]/g, '*');
|
|
235
|
-
path = path.replace(/\[\.\.\.(\w+)\]/g, '*');
|
|
236
|
-
// dynamic segments: [param]
|
|
237
|
-
path = path.replace(/\[(\w+)\]/g, ':$1');
|
|
238
|
-
// strip trailing slash that might result from above
|
|
239
|
-
path = path.replace(/\/$/, '');
|
|
240
|
-
return path ? `/${path}` : '/';
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
/**
|
|
244
|
-
* Convert an app/.../route.ts path to an HTTP route path.
|
|
245
|
-
* examples:
|
|
246
|
-
* app/route.ts → /
|
|
247
|
-
* app/users/route.ts → /users
|
|
248
|
-
* app/users/[id]/route.ts → /users/:id
|
|
249
|
-
*/
|
|
250
|
-
export function appPathToRoute(relPath: string): string {
|
|
251
|
-
// strip leading 'app/' and trailing '/route.<ext>' or 'route.<ext>'
|
|
252
|
-
let path = relPath
|
|
253
|
-
.replace(/^app\//, '')
|
|
254
|
-
.replace(/\/route\.(tsx?|jsx?)$/, '')
|
|
255
|
-
.replace(/^route\.(tsx?|jsx?)$/, '');
|
|
256
|
-
// catch-all
|
|
257
|
-
path = path.replace(/\[\[\.\.\.(\w+)\]\]/g, '*');
|
|
258
|
-
path = path.replace(/\[\.\.\.(\w+)\]/g, '*');
|
|
259
|
-
// dynamic segments
|
|
260
|
-
path = path.replace(/\[(\w+)\]/g, ':$1');
|
|
261
|
-
path = path.replace(/\/$/, '');
|
|
262
|
-
return path ? `/${path}` : '/';
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
// ── Extract default export name ───────────────────────────────────────────────
|
|
266
|
-
|
|
267
|
-
/** Returns the exported identifier from `export default function X` or `export default X` */
|
|
268
|
-
export function extractDefaultExportName(source: string): string | undefined {
|
|
269
|
-
// export default function handler or export default async function handler
|
|
270
|
-
const fnMatch = source.match(/export\s+default\s+(?:async\s+)?function\s+(\w+)/);
|
|
271
|
-
if (fnMatch) return fnMatch[1];
|
|
272
|
-
// export default identifier (not an object literal or class expression)
|
|
273
|
-
const idMatch = source.match(/export\s+default\s+([A-Za-z_$][A-Za-z0-9_$]*)\s*[;\n]/);
|
|
274
|
-
if (idMatch) return idMatch[1];
|
|
275
|
-
return undefined;
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
// ── Express route extraction ──────────────────────────────────────────────────
|
|
279
|
-
|
|
280
|
-
interface DetectedRoute {
|
|
281
|
-
method: string;
|
|
282
|
-
path: string;
|
|
283
|
-
handlerName?: string;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
const EXPRESS_ROUTE_RE =
|
|
287
|
-
/(?:app|router|server)\s*\.\s*(get|post|put|delete|patch|use)\s*\(\s*['"]([^'"]+)['"]\s*(?:,\s*([A-Za-z_$][A-Za-z0-9_$]*))?/gi;
|
|
288
|
-
|
|
289
|
-
export function extractExpressRoutes(source: string, _filePath: string, _ext: string): DetectedRoute[] {
|
|
290
|
-
const results: DetectedRoute[] = [];
|
|
291
|
-
let match: RegExpExecArray | null;
|
|
292
|
-
const re = new RegExp(EXPRESS_ROUTE_RE.source, 'gi');
|
|
293
|
-
while ((match = re.exec(source)) !== null) {
|
|
294
|
-
const httpMethod = match[1].toUpperCase() as HttpMethod;
|
|
295
|
-
const routePath = match[2];
|
|
296
|
-
const handlerName = match[3];
|
|
297
|
-
results.push({ method: httpMethod, path: routePath, handlerName });
|
|
298
|
-
}
|
|
299
|
-
return results;
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
// ── NestJS decorator extraction ───────────────────────────────────────────────
|
|
303
|
-
|
|
304
|
-
const CONTROLLER_RE = /@Controller\(\s*['"]([^'"]*)['"]\s*\)/g;
|
|
305
|
-
// Method-level decorators and the following method name
|
|
306
|
-
const NEST_METHOD_RE =
|
|
307
|
-
/@(Get|Post|Put|Delete|Patch)\s*\(\s*['"]([^'"]*)['"]\s*\)\s*(?:[\w\s,():?<>[\]|&.]+?\s+)?(\w+)\s*\(/gis;
|
|
308
|
-
|
|
309
|
-
export function extractNestRoutes(source: string, _filePath: string, _ext: string): DetectedRoute[] {
|
|
310
|
-
// Find controller prefix (use first @Controller decorator found)
|
|
311
|
-
let controllerPrefix = '';
|
|
312
|
-
const ctrlMatch = CONTROLLER_RE.exec(source);
|
|
313
|
-
if (ctrlMatch) {
|
|
314
|
-
controllerPrefix = ctrlMatch[1].replace(/\/$/, '');
|
|
315
|
-
}
|
|
316
|
-
// Reset lastIndex
|
|
317
|
-
CONTROLLER_RE.lastIndex = 0;
|
|
318
|
-
|
|
319
|
-
const results: DetectedRoute[] = [];
|
|
320
|
-
let match: RegExpExecArray | null;
|
|
321
|
-
const re = new RegExp(NEST_METHOD_RE.source, 'gis');
|
|
322
|
-
while ((match = re.exec(source)) !== null) {
|
|
323
|
-
const httpMethod = match[1].toUpperCase();
|
|
324
|
-
const methodPath = match[2].replace(/^\//, '');
|
|
325
|
-
const handlerName = match[3];
|
|
326
|
-
const full = controllerPrefix
|
|
327
|
-
? `/${controllerPrefix}/${methodPath}`.replace(/\/+/g, '/')
|
|
328
|
-
: `/${methodPath}`;
|
|
329
|
-
results.push({ method: httpMethod, path: full, handlerName });
|
|
330
|
-
}
|
|
331
|
-
return results;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
// ── Utilities ─────────────────────────────────────────────────────────────────
|
|
335
|
-
|
|
336
|
-
function safeReadSource(absPath: string, maxBytes: number): string | undefined {
|
|
337
|
-
try {
|
|
338
|
-
const stat = statSync(absPath);
|
|
339
|
-
if (stat.size > maxBytes) return undefined;
|
|
340
|
-
return readFileSync(absPath, 'utf-8');
|
|
341
|
-
} catch {
|
|
342
|
-
return undefined;
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
function langFromExt(ext: string): string {
|
|
347
|
-
if (ext === '.ts' || ext === '.tsx') return 'typescript';
|
|
348
|
-
if (ext === '.js' || ext === '.jsx' || ext === '.mjs' || ext === '.cjs') return 'javascript';
|
|
349
|
-
return 'unknown';
|
|
350
|
-
}
|