@monoes/monograph 1.5.6 → 1.5.7
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 +25 -9
- package/dist/src/mcp-tools/impact.d.ts.map +1 -1
- package/dist/src/mcp-tools/impact.js +1 -10
- package/dist/src/mcp-tools/impact.js.map +1 -1
- 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/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
package/src/results/types.ts
DELETED
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
export type DependencyLocation = 'Dependencies' | 'DevDependencies' | 'OptionalDependencies' | 'PeerDependencies';
|
|
2
|
-
|
|
3
|
-
export interface UnusedFile {
|
|
4
|
-
filePath: string;
|
|
5
|
-
sizeBytes?: number;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export interface UnusedExport {
|
|
9
|
-
filePath: string;
|
|
10
|
-
exportName: string;
|
|
11
|
-
line?: number;
|
|
12
|
-
col?: number;
|
|
13
|
-
isType?: boolean;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export interface UnusedMember {
|
|
17
|
-
filePath: string;
|
|
18
|
-
memberName: string;
|
|
19
|
-
parentName?: string;
|
|
20
|
-
kind?: 'method' | 'property' | 'getter' | 'setter' | 'accessor' | 'constructor';
|
|
21
|
-
line?: number;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export interface UnusedDependency {
|
|
25
|
-
name: string;
|
|
26
|
-
location: DependencyLocation;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export interface CircularDependency {
|
|
30
|
-
cycle: string[];
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export interface BoundaryViolation {
|
|
34
|
-
fromFile: string;
|
|
35
|
-
toFile: string;
|
|
36
|
-
fromBoundary: string;
|
|
37
|
-
toBoundary: string;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export interface StaleSuppression {
|
|
41
|
-
filePath: string;
|
|
42
|
-
line: number;
|
|
43
|
-
kind: string;
|
|
44
|
-
comment: string;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export interface PrivateTypeLeak {
|
|
48
|
-
filePath: string;
|
|
49
|
-
exportName: string;
|
|
50
|
-
leakedType: string;
|
|
51
|
-
line?: number;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export interface DuplicateExport {
|
|
55
|
-
exportName: string;
|
|
56
|
-
files: string[];
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export interface AnalysisResults {
|
|
60
|
-
unusedFiles: UnusedFile[];
|
|
61
|
-
unusedExports: UnusedExport[];
|
|
62
|
-
unusedTypes: UnusedExport[];
|
|
63
|
-
privateTypeLeaks: PrivateTypeLeak[];
|
|
64
|
-
unusedDependencies: UnusedDependency[];
|
|
65
|
-
unusedEnumMembers: UnusedMember[];
|
|
66
|
-
unusedClassMembers: UnusedMember[];
|
|
67
|
-
unresolvedImports: Array<{ filePath: string; specifier: string; line?: number }>;
|
|
68
|
-
unlistedDependencies: UnusedDependency[];
|
|
69
|
-
duplicateExports: DuplicateExport[];
|
|
70
|
-
circularDependencies: CircularDependency[];
|
|
71
|
-
boundaryViolations: BoundaryViolation[];
|
|
72
|
-
staleSuppressions: StaleSuppression[];
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
export function makeEmptyAnalysisResults(): AnalysisResults {
|
|
76
|
-
return {
|
|
77
|
-
unusedFiles: [],
|
|
78
|
-
unusedExports: [],
|
|
79
|
-
unusedTypes: [],
|
|
80
|
-
privateTypeLeaks: [],
|
|
81
|
-
unusedDependencies: [],
|
|
82
|
-
unusedEnumMembers: [],
|
|
83
|
-
unusedClassMembers: [],
|
|
84
|
-
unresolvedImports: [],
|
|
85
|
-
unlistedDependencies: [],
|
|
86
|
-
duplicateExports: [],
|
|
87
|
-
circularDependencies: [],
|
|
88
|
-
boundaryViolations: [],
|
|
89
|
-
staleSuppressions: [],
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
export function totalIssues(results: AnalysisResults): number {
|
|
94
|
-
return (
|
|
95
|
-
results.unusedFiles.length +
|
|
96
|
-
results.unusedExports.length +
|
|
97
|
-
results.unusedTypes.length +
|
|
98
|
-
results.privateTypeLeaks.length +
|
|
99
|
-
results.unusedDependencies.length +
|
|
100
|
-
results.unusedEnumMembers.length +
|
|
101
|
-
results.unusedClassMembers.length +
|
|
102
|
-
results.unresolvedImports.length +
|
|
103
|
-
results.unlistedDependencies.length +
|
|
104
|
-
results.duplicateExports.length +
|
|
105
|
-
results.circularDependencies.length +
|
|
106
|
-
results.boundaryViolations.length +
|
|
107
|
-
results.staleSuppressions.length
|
|
108
|
-
);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
export function hasIssues(results: AnalysisResults): boolean {
|
|
112
|
-
return totalIssues(results) > 0;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
export function mergeAnalysisResults(a: AnalysisResults, b: AnalysisResults): AnalysisResults {
|
|
116
|
-
return {
|
|
117
|
-
unusedFiles: [...a.unusedFiles, ...b.unusedFiles],
|
|
118
|
-
unusedExports: [...a.unusedExports, ...b.unusedExports],
|
|
119
|
-
unusedTypes: [...a.unusedTypes, ...b.unusedTypes],
|
|
120
|
-
privateTypeLeaks: [...a.privateTypeLeaks, ...b.privateTypeLeaks],
|
|
121
|
-
unusedDependencies: [...a.unusedDependencies, ...b.unusedDependencies],
|
|
122
|
-
unusedEnumMembers: [...a.unusedEnumMembers, ...b.unusedEnumMembers],
|
|
123
|
-
unusedClassMembers: [...a.unusedClassMembers, ...b.unusedClassMembers],
|
|
124
|
-
unresolvedImports: [...a.unresolvedImports, ...b.unresolvedImports],
|
|
125
|
-
unlistedDependencies: [...a.unlistedDependencies, ...b.unlistedDependencies],
|
|
126
|
-
duplicateExports: [...a.duplicateExports, ...b.duplicateExports],
|
|
127
|
-
circularDependencies: [...a.circularDependencies, ...b.circularDependencies],
|
|
128
|
-
boundaryViolations: [...a.boundaryViolations, ...b.boundaryViolations],
|
|
129
|
-
staleSuppressions: [...a.staleSuppressions, ...b.staleSuppressions],
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
export function filterResultsByFile(results: AnalysisResults, filePaths: Set<string>): AnalysisResults {
|
|
134
|
-
return {
|
|
135
|
-
unusedFiles: results.unusedFiles.filter(r => filePaths.has(r.filePath)),
|
|
136
|
-
unusedExports: results.unusedExports.filter(r => filePaths.has(r.filePath)),
|
|
137
|
-
unusedTypes: results.unusedTypes.filter(r => filePaths.has(r.filePath)),
|
|
138
|
-
privateTypeLeaks: results.privateTypeLeaks.filter(r => filePaths.has(r.filePath)),
|
|
139
|
-
unusedDependencies: results.unusedDependencies,
|
|
140
|
-
unusedEnumMembers: results.unusedEnumMembers.filter(r => filePaths.has(r.filePath)),
|
|
141
|
-
unusedClassMembers: results.unusedClassMembers.filter(r => filePaths.has(r.filePath)),
|
|
142
|
-
unresolvedImports: results.unresolvedImports.filter(r => filePaths.has(r.filePath)),
|
|
143
|
-
unlistedDependencies: results.unlistedDependencies,
|
|
144
|
-
duplicateExports: results.duplicateExports,
|
|
145
|
-
circularDependencies: results.circularDependencies.filter(c => c.cycle.some(f => filePaths.has(f))),
|
|
146
|
-
boundaryViolations: results.boundaryViolations.filter(b => filePaths.has(b.fromFile)),
|
|
147
|
-
staleSuppressions: results.staleSuppressions.filter(r => filePaths.has(r.filePath)),
|
|
148
|
-
};
|
|
149
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Evidence weight constants for scope-based resolution.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export const EvidenceWeights = {
|
|
6
|
-
local: 0.55,
|
|
7
|
-
import: 0.45,
|
|
8
|
-
reexport: 0.4,
|
|
9
|
-
namespace: 0.4,
|
|
10
|
-
wildcard: 0.3,
|
|
11
|
-
|
|
12
|
-
scopeChainPerDepth: -0.02,
|
|
13
|
-
|
|
14
|
-
typeBindingByMroDepth: [0.5, 0.42, 0.36, 0.32, 0.3] as const,
|
|
15
|
-
|
|
16
|
-
ownerMatch: 0.2,
|
|
17
|
-
kindMatch: 0.0,
|
|
18
|
-
|
|
19
|
-
arityMatchCompatible: 0.1,
|
|
20
|
-
arityMatchUnknown: 0.0,
|
|
21
|
-
arityMatchIncompatible: -0.15,
|
|
22
|
-
|
|
23
|
-
globalQualified: 0.35,
|
|
24
|
-
globalName: 0.1,
|
|
25
|
-
|
|
26
|
-
dynamicImportUnresolved: 0.02,
|
|
27
|
-
|
|
28
|
-
unlinkedImportMultiplier: 0.5,
|
|
29
|
-
} as const;
|
|
30
|
-
|
|
31
|
-
export function typeBindingWeightAtDepth(mroDepth: number): number {
|
|
32
|
-
const table = EvidenceWeights.typeBindingByMroDepth;
|
|
33
|
-
if (mroDepth < 0) return table[0];
|
|
34
|
-
if (mroDepth >= table.length) return table[table.length - 1]!;
|
|
35
|
-
return table[mroDepth]!;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export function composeWeights(...weights: number[]): number {
|
|
39
|
-
const sum = weights.reduce((s, w) => s + w, 0);
|
|
40
|
-
return Math.min(1.0, Math.max(0.0, sum));
|
|
41
|
-
}
|
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
export interface ChunkOptions {
|
|
2
|
-
maxTokens?: number; // default 512
|
|
3
|
-
overlap?: number; // default 50 (token overlap between adjacent chunks)
|
|
4
|
-
minTokens?: number; // default 20 (discard chunks smaller than this)
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export interface Chunk {
|
|
8
|
-
text: string;
|
|
9
|
-
startLine: number;
|
|
10
|
-
endLine: number;
|
|
11
|
-
kind: 'function' | 'class' | 'block' | 'comment' | 'import' | 'other';
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
const IMPORT_RE = /^(import\s|export\s*\{[^}]*\}\s*from)/;
|
|
15
|
-
const FUNCTION_RE = /^(export\s+)?(async\s+)?function\s+\w+|^(export\s+)?const\s+\w+\s*=\s*(async\s+)?\(/;
|
|
16
|
-
const CLASS_RE = /^(export\s+)?(abstract\s+)?class\s+\w+/;
|
|
17
|
-
const COMMENT_RE = /^(\/\/|\/\*| \*)/;
|
|
18
|
-
|
|
19
|
-
type LineKind = 'function' | 'class' | 'block' | 'comment' | 'import' | 'other';
|
|
20
|
-
|
|
21
|
-
function estimateTokens(text: string): number {
|
|
22
|
-
return Math.ceil(text.length / 4);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function classifyLine(line: string): LineKind {
|
|
26
|
-
const trimmed = line.trimStart();
|
|
27
|
-
if (IMPORT_RE.test(trimmed)) return 'import';
|
|
28
|
-
if (FUNCTION_RE.test(trimmed)) return 'function';
|
|
29
|
-
if (CLASS_RE.test(trimmed)) return 'class';
|
|
30
|
-
if (COMMENT_RE.test(trimmed)) return 'comment';
|
|
31
|
-
return 'other';
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
interface LineGroup {
|
|
35
|
-
lines: string[];
|
|
36
|
-
startLine: number; // 1-based
|
|
37
|
-
kind: LineKind;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
function groupLines(sourceLines: string[]): LineGroup[] {
|
|
41
|
-
const groups: LineGroup[] = [];
|
|
42
|
-
let i = 0;
|
|
43
|
-
|
|
44
|
-
while (i < sourceLines.length) {
|
|
45
|
-
const line = sourceLines[i];
|
|
46
|
-
const trimmed = line.trim();
|
|
47
|
-
|
|
48
|
-
// Skip blank lines (treat them as other with 0 tokens — they'll be filtered)
|
|
49
|
-
if (trimmed === '') {
|
|
50
|
-
i++;
|
|
51
|
-
continue;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const kind = classifyLine(trimmed);
|
|
55
|
-
|
|
56
|
-
// For groupable kinds (import, comment), collect consecutive matching lines
|
|
57
|
-
if (kind === 'import' || kind === 'comment') {
|
|
58
|
-
const startIdx = i;
|
|
59
|
-
const collected: string[] = [line];
|
|
60
|
-
i++;
|
|
61
|
-
while (i < sourceLines.length) {
|
|
62
|
-
const next = sourceLines[i].trim();
|
|
63
|
-
if (next === '') break;
|
|
64
|
-
const nextKind = classifyLine(next);
|
|
65
|
-
if (nextKind === kind) {
|
|
66
|
-
collected.push(sourceLines[i]);
|
|
67
|
-
i++;
|
|
68
|
-
} else {
|
|
69
|
-
break;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
groups.push({ lines: collected, startLine: startIdx + 1, kind });
|
|
73
|
-
} else if (kind === 'function' || kind === 'class') {
|
|
74
|
-
// Collect the block: track brace depth
|
|
75
|
-
const startIdx = i;
|
|
76
|
-
const collected: string[] = [line];
|
|
77
|
-
i++;
|
|
78
|
-
let depth = (line.match(/\{/g) || []).length - (line.match(/\}/g) || []).length;
|
|
79
|
-
|
|
80
|
-
// If no opening brace on the first line yet, keep reading until we have one
|
|
81
|
-
while (i < sourceLines.length && depth <= 0) {
|
|
82
|
-
const cur = sourceLines[i];
|
|
83
|
-
collected.push(cur);
|
|
84
|
-
depth += (cur.match(/\{/g) || []).length - (cur.match(/\}/g) || []).length;
|
|
85
|
-
i++;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// Now consume until depth returns to 0
|
|
89
|
-
while (i < sourceLines.length && depth > 0) {
|
|
90
|
-
const cur = sourceLines[i];
|
|
91
|
-
collected.push(cur);
|
|
92
|
-
depth += (cur.match(/\{/g) || []).length - (cur.match(/\}/g) || []).length;
|
|
93
|
-
i++;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
groups.push({ lines: collected, startLine: startIdx + 1, kind });
|
|
97
|
-
} else {
|
|
98
|
-
// 'other': collect consecutive non-blank other lines into one group
|
|
99
|
-
const startIdx = i;
|
|
100
|
-
const collected: string[] = [line];
|
|
101
|
-
i++;
|
|
102
|
-
while (i < sourceLines.length) {
|
|
103
|
-
const next = sourceLines[i].trim();
|
|
104
|
-
if (next === '') break;
|
|
105
|
-
const nextKind = classifyLine(next);
|
|
106
|
-
if (nextKind === 'other') {
|
|
107
|
-
collected.push(sourceLines[i]);
|
|
108
|
-
i++;
|
|
109
|
-
} else {
|
|
110
|
-
break;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
groups.push({ lines: collected, startLine: startIdx + 1, kind });
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
return groups;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
function splitGroupIntoChunks(
|
|
121
|
-
group: LineGroup,
|
|
122
|
-
maxTokens: number,
|
|
123
|
-
overlap: number,
|
|
124
|
-
): Chunk[] {
|
|
125
|
-
const lines = group.lines;
|
|
126
|
-
const result: Chunk[] = [];
|
|
127
|
-
|
|
128
|
-
// Tokens per line (estimated)
|
|
129
|
-
const lineTokens = lines.map(l => estimateTokens(l));
|
|
130
|
-
|
|
131
|
-
let start = 0; // index into lines[]
|
|
132
|
-
|
|
133
|
-
while (start < lines.length) {
|
|
134
|
-
let tokenCount = 0;
|
|
135
|
-
let end = start;
|
|
136
|
-
|
|
137
|
-
while (end < lines.length && tokenCount + lineTokens[end] <= maxTokens) {
|
|
138
|
-
tokenCount += lineTokens[end];
|
|
139
|
-
end++;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// If we couldn't advance even one line (single line exceeds maxTokens), force include it
|
|
143
|
-
if (end === start) {
|
|
144
|
-
end = start + 1;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
const chunkLines = lines.slice(start, end);
|
|
148
|
-
const text = chunkLines.join('\n');
|
|
149
|
-
const startLine = group.startLine + start;
|
|
150
|
-
const endLine = group.startLine + end - 1;
|
|
151
|
-
|
|
152
|
-
result.push({ text, startLine, endLine, kind: group.kind });
|
|
153
|
-
|
|
154
|
-
if (end >= lines.length) break;
|
|
155
|
-
|
|
156
|
-
// Calculate how many lines from the end of this chunk to include as overlap
|
|
157
|
-
// for the next chunk's start. Count back until overlap token budget is met.
|
|
158
|
-
let overlapTokens = 0;
|
|
159
|
-
let overlapLineCount = 0;
|
|
160
|
-
for (let j = end - 1; j >= start; j--) {
|
|
161
|
-
if (overlapTokens + lineTokens[j] > overlap) break;
|
|
162
|
-
overlapTokens += lineTokens[j];
|
|
163
|
-
overlapLineCount++;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// Next start is (end - overlapLineCount), but must be strictly > start to avoid looping
|
|
167
|
-
const nextStart = Math.max(start + 1, end - overlapLineCount);
|
|
168
|
-
start = nextStart;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
return result;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
export function chunkSource(source: string, options?: ChunkOptions): Chunk[] {
|
|
175
|
-
const maxTokens = options?.maxTokens ?? 512;
|
|
176
|
-
const overlap = options?.overlap ?? 50;
|
|
177
|
-
const minTokens = options?.minTokens ?? 5;
|
|
178
|
-
|
|
179
|
-
if (!source || source.trim() === '') return [];
|
|
180
|
-
|
|
181
|
-
const sourceLines = source.split('\n');
|
|
182
|
-
const groups = groupLines(sourceLines);
|
|
183
|
-
|
|
184
|
-
const chunks: Chunk[] = [];
|
|
185
|
-
|
|
186
|
-
for (const group of groups) {
|
|
187
|
-
const text = group.lines.join('\n');
|
|
188
|
-
const tokens = estimateTokens(text);
|
|
189
|
-
|
|
190
|
-
if (tokens <= maxTokens) {
|
|
191
|
-
chunks.push({
|
|
192
|
-
text,
|
|
193
|
-
startLine: group.startLine,
|
|
194
|
-
endLine: group.startLine + group.lines.length - 1,
|
|
195
|
-
kind: group.kind,
|
|
196
|
-
});
|
|
197
|
-
} else {
|
|
198
|
-
// Split into sub-chunks with overlap
|
|
199
|
-
const subChunks = splitGroupIntoChunks(group, maxTokens, overlap);
|
|
200
|
-
chunks.push(...subChunks);
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// Discard chunks below minTokens
|
|
205
|
-
return chunks.filter(c => estimateTokens(c.text) >= minTokens);
|
|
206
|
-
}
|
package/src/search/diacritic.ts
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* BM25 search (FTS5) with the historical "hybrid" entry-point signature.
|
|
3
|
-
*
|
|
4
|
-
* Monograph search is BM25-only. The former embedding/vector branch
|
|
5
|
-
* (gated on MONOGRAPH_EMBEDDINGS=true) was removed — it was never run in
|
|
6
|
-
* practice (the embeddings table stayed empty) and did a JS cosine full
|
|
7
|
-
* scan. The exported function signatures are unchanged so callers do not
|
|
8
|
-
* need to change.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import type Database from 'better-sqlite3';
|
|
12
|
-
import type { RankedResult } from './rrf.js';
|
|
13
|
-
import { ftsSearch } from '../storage/fts-store.js';
|
|
14
|
-
import { normalizeSearchTerm } from './diacritic.js';
|
|
15
|
-
|
|
16
|
-
export interface HybridQueryOptions {
|
|
17
|
-
limit?: number;
|
|
18
|
-
label?: string;
|
|
19
|
-
/** @deprecated Embeddings are disabled — this option is ignored; search is BM25-only. */
|
|
20
|
-
embedder?: unknown;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export interface HybridResult extends RankedResult {
|
|
24
|
-
id: string;
|
|
25
|
-
name: string;
|
|
26
|
-
normLabel: string;
|
|
27
|
-
filePath: string | null;
|
|
28
|
-
label: string;
|
|
29
|
-
score: number;
|
|
30
|
-
/** First line of the symbol in its source file (1-based, null if unknown). */
|
|
31
|
-
startLine?: number | null;
|
|
32
|
-
/** Last line of the symbol in its source file (1-based, null if unknown). */
|
|
33
|
-
endLine?: number | null;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Run a BM25 (FTS5) search. Despite the name, this is BM25-only — the
|
|
38
|
-
* vector branch was removed; the `embedder` option is ignored.
|
|
39
|
-
*/
|
|
40
|
-
export async function hybridQuery(
|
|
41
|
-
db: Database.Database,
|
|
42
|
-
query: string,
|
|
43
|
-
options: HybridQueryOptions = {},
|
|
44
|
-
): Promise<HybridResult[]> {
|
|
45
|
-
const { limit = 20, label } = options;
|
|
46
|
-
|
|
47
|
-
// Normalize the query for text-based lookups (strip diacritics, lowercase, trim)
|
|
48
|
-
const normalizedQuery = normalizeSearchTerm(query);
|
|
49
|
-
|
|
50
|
-
// ── BM25 via FTS5 ──────────────────────────────────────────────────────────
|
|
51
|
-
const bm25Limit = Math.max(limit, 50);
|
|
52
|
-
const bm25Raw = ftsSearch(db, normalizedQuery, bm25Limit, label);
|
|
53
|
-
const bm25Results: RankedResult[] = bm25Raw.map((r) => ({
|
|
54
|
-
id: r.id,
|
|
55
|
-
name: r.name,
|
|
56
|
-
normLabel: r.normLabel,
|
|
57
|
-
filePath: r.filePath,
|
|
58
|
-
label: r.label,
|
|
59
|
-
score: r.rank,
|
|
60
|
-
startLine: r.startLine,
|
|
61
|
-
endLine: r.endLine,
|
|
62
|
-
}));
|
|
63
|
-
|
|
64
|
-
return bm25Results.slice(0, limit) as HybridResult[];
|
|
65
|
-
}
|
package/src/search/rrf.ts
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Reciprocal Rank Fusion (RRF)
|
|
3
|
-
*
|
|
4
|
-
* Merges two ranked result lists using the formula:
|
|
5
|
-
* score(d) = sum over each list of: 1 / (K + rank_of_d_in_list)
|
|
6
|
-
*
|
|
7
|
-
* where rank is 1-based.
|
|
8
|
-
*
|
|
9
|
-
* Reference: Cormack, Clarke & Buettcher (SIGIR 2009).
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
export interface RankedResult {
|
|
13
|
-
id: string;
|
|
14
|
-
score: number;
|
|
15
|
-
[key: string]: unknown;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Merge two ranked lists via RRF and return results sorted by fused score descending.
|
|
20
|
-
*
|
|
21
|
-
* @param list1 - First ranked list (ordered by relevance, best first)
|
|
22
|
-
* @param list2 - Second ranked list (ordered by relevance, best first)
|
|
23
|
-
* @param K - RRF constant (default 60, per the original paper)
|
|
24
|
-
*/
|
|
25
|
-
export function mergeRanks(
|
|
26
|
-
list1: RankedResult[],
|
|
27
|
-
list2: RankedResult[],
|
|
28
|
-
K = 60,
|
|
29
|
-
): RankedResult[] {
|
|
30
|
-
const scoreMap = new Map<string, { rrf: number; payload: RankedResult }>();
|
|
31
|
-
|
|
32
|
-
const addList = (list: RankedResult[]) => {
|
|
33
|
-
list.forEach((item, idx) => {
|
|
34
|
-
const rank = idx + 1; // 1-based
|
|
35
|
-
const contribution = 1 / (K + rank);
|
|
36
|
-
const existing = scoreMap.get(item.id);
|
|
37
|
-
if (existing) {
|
|
38
|
-
existing.rrf += contribution;
|
|
39
|
-
} else {
|
|
40
|
-
scoreMap.set(item.id, { rrf: contribution, payload: item });
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
addList(list1);
|
|
46
|
-
addList(list2);
|
|
47
|
-
|
|
48
|
-
return [...scoreMap.values()]
|
|
49
|
-
.sort((a, b) => b.rrf - a.rrf)
|
|
50
|
-
.map(({ rrf, payload }) => ({ ...payload, score: rrf }));
|
|
51
|
-
}
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
const PRIVATE_IP_PATTERNS: RegExp[] = [
|
|
2
|
-
/^127\./,
|
|
3
|
-
/^10\./,
|
|
4
|
-
/^192\.168\./,
|
|
5
|
-
/^172\.(1[6-9]|2\d|3[01])\./,
|
|
6
|
-
/^169\.254\./,
|
|
7
|
-
/^::1$|\[::1\]/,
|
|
8
|
-
/^fc00:|^\[fc00:/i,
|
|
9
|
-
/^fe80:|^\[fe80:/i,
|
|
10
|
-
// IPv4-mapped IPv6 (e.g. ::ffff:192.168.1.1) — covers private ranges via mapped form
|
|
11
|
-
/^::ffff:/i,
|
|
12
|
-
/^\[::ffff:/i,
|
|
13
|
-
];
|
|
14
|
-
|
|
15
|
-
const CLOUD_METADATA_HOSTS = new Set([
|
|
16
|
-
'metadata.google.internal',
|
|
17
|
-
'metadata.goog',
|
|
18
|
-
'169.254.169.254',
|
|
19
|
-
]);
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Returns true if the given URL resolves to a private, loopback, or cloud
|
|
23
|
-
* metadata address that should be blocked to prevent SSRF attacks.
|
|
24
|
-
*/
|
|
25
|
-
export function isPrivateUrl(rawUrl: string): boolean {
|
|
26
|
-
let url: URL;
|
|
27
|
-
try {
|
|
28
|
-
url = new URL(rawUrl);
|
|
29
|
-
} catch {
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
|
-
const host = url.hostname;
|
|
33
|
-
if (host === 'localhost') return true;
|
|
34
|
-
if (CLOUD_METADATA_HOSTS.has(host)) return true;
|
|
35
|
-
return PRIVATE_IP_PATTERNS.some(p => p.test(host));
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Validates that a URL is safe to fetch: must use http/https and must not
|
|
40
|
-
* resolve to a private or reserved address.
|
|
41
|
-
* @throws {Error} if the URL is invalid, uses an unsupported scheme, or is private
|
|
42
|
-
*/
|
|
43
|
-
export function validateUrl(rawUrl: string): void {
|
|
44
|
-
let url: URL;
|
|
45
|
-
try {
|
|
46
|
-
url = new URL(rawUrl);
|
|
47
|
-
} catch {
|
|
48
|
-
throw new Error(`Invalid URL: ${rawUrl}`);
|
|
49
|
-
}
|
|
50
|
-
if (!['http:', 'https:'].includes(url.protocol)) {
|
|
51
|
-
throw new Error(`Unsupported scheme: ${url.protocol}`);
|
|
52
|
-
}
|
|
53
|
-
if (isPrivateUrl(rawUrl)) {
|
|
54
|
-
throw new Error(`URL resolves to private/reserved address: ${url.hostname}`);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Fetches the content of a URL after validating it is safe (not private/internal).
|
|
60
|
-
* Enforces a maximum response size and request timeout.
|
|
61
|
-
*
|
|
62
|
-
* @param rawUrl - The URL to fetch
|
|
63
|
-
* @param opts.maxBytes - Maximum allowed response size in bytes (default 10 MB)
|
|
64
|
-
* @param opts.timeoutMs - Request timeout in milliseconds (default 10 000)
|
|
65
|
-
* @returns The response body as a string
|
|
66
|
-
* @throws {Error} if the URL is unsafe, the request fails, or the response is too large
|
|
67
|
-
*/
|
|
68
|
-
export async function safeFetch(
|
|
69
|
-
rawUrl: string,
|
|
70
|
-
opts: { maxBytes?: number; timeoutMs?: number } = {},
|
|
71
|
-
): Promise<string> {
|
|
72
|
-
validateUrl(rawUrl);
|
|
73
|
-
const { maxBytes = 10 * 1024 * 1024, timeoutMs = 10_000 } = opts;
|
|
74
|
-
const controller = new AbortController();
|
|
75
|
-
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
76
|
-
try {
|
|
77
|
-
const res = await fetch(rawUrl, { signal: controller.signal });
|
|
78
|
-
if (!res.ok) throw new Error(`HTTP ${res.status}: ${rawUrl}`);
|
|
79
|
-
|
|
80
|
-
// Stream the body incrementally so we can enforce maxBytes before
|
|
81
|
-
// the full response is loaded into memory (prevents memory exhaustion
|
|
82
|
-
// on large/malicious payloads).
|
|
83
|
-
if (!res.body) {
|
|
84
|
-
throw new Error(`Response body is missing: ${rawUrl}`);
|
|
85
|
-
}
|
|
86
|
-
const reader = (res.body as ReadableStream<Uint8Array>).getReader();
|
|
87
|
-
const decoder = new TextDecoder();
|
|
88
|
-
const chunks: string[] = [];
|
|
89
|
-
let totalBytes = 0;
|
|
90
|
-
|
|
91
|
-
try {
|
|
92
|
-
while (true) {
|
|
93
|
-
const { value, done } = await reader.read();
|
|
94
|
-
if (done) break;
|
|
95
|
-
if (value) {
|
|
96
|
-
totalBytes += value.byteLength;
|
|
97
|
-
if (totalBytes > maxBytes) {
|
|
98
|
-
throw new Error(`Response exceeds ${maxBytes} bytes: ${rawUrl}`);
|
|
99
|
-
}
|
|
100
|
-
chunks.push(decoder.decode(value, { stream: true }));
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
// Flush any remaining bytes held in the decoder
|
|
104
|
-
chunks.push(decoder.decode());
|
|
105
|
-
} finally {
|
|
106
|
-
reader.releaseLock();
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
return chunks.join('');
|
|
110
|
-
} finally {
|
|
111
|
-
clearTimeout(timer);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { basename as pathBasename } from 'path';
|
|
2
|
-
|
|
3
|
-
const SENSITIVE_PATTERNS: RegExp[] = [
|
|
4
|
-
/^\.env(\.|$)/i,
|
|
5
|
-
/^\.netrc$/i,
|
|
6
|
-
/\baws_credentials\b/i,
|
|
7
|
-
/\bcredentials?\b.*\.(json|yaml|yml|toml|ini|cfg)$/i,
|
|
8
|
-
/\bsecrets?\b.*\.(json|yaml|yml|toml|ini|cfg)$/i,
|
|
9
|
-
/\bsecret[_-]?key\b/i,
|
|
10
|
-
/\bapi[_-]?key\b.*\.(json|txt)$/i,
|
|
11
|
-
/\bpasswd\b/i,
|
|
12
|
-
/\bpassword[s]?\b.*\.(txt|json|yaml|yml)$/i,
|
|
13
|
-
/\btoken\b.*\.(txt|json|env)$/i,
|
|
14
|
-
/\b(id_rsa|id_dsa|id_ecdsa|id_ed25519)(\.pub)?$/i,
|
|
15
|
-
/\.(pem|key|pfx|p12|p8|pkcs8)$/i,
|
|
16
|
-
/\bservice[_-]?account\b.*\.json$/i,
|
|
17
|
-
/\bkeystore\b/i,
|
|
18
|
-
/\bvault[_-]?token\b/i,
|
|
19
|
-
];
|
|
20
|
-
|
|
21
|
-
export function isSensitiveFile(filePath: string): boolean {
|
|
22
|
-
const base = pathBasename(filePath);
|
|
23
|
-
return SENSITIVE_PATTERNS.some(p => p.test(base) || p.test(filePath));
|
|
24
|
-
}
|