@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/mcp-tools/rename.ts
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import { readFileSync, statSync } from 'fs';
|
|
2
|
-
import type Database from 'better-sqlite3';
|
|
3
|
-
import type { MonographNode } from '../types.js';
|
|
4
|
-
|
|
5
|
-
// ── Row → MonographNode mapper ─────────────────────────────────────────────────
|
|
6
|
-
|
|
7
|
-
function rowToNode(row: Record<string, unknown>): MonographNode {
|
|
8
|
-
return {
|
|
9
|
-
id: row.id as string,
|
|
10
|
-
label: row.label as MonographNode['label'],
|
|
11
|
-
name: row.name as string,
|
|
12
|
-
normLabel: row.norm_label as string,
|
|
13
|
-
filePath: row.file_path as string | undefined,
|
|
14
|
-
startLine: row.start_line as number | undefined,
|
|
15
|
-
endLine: row.end_line as number | undefined,
|
|
16
|
-
communityId: row.community_id as number | undefined,
|
|
17
|
-
isExported: (row.is_exported as number) === 1,
|
|
18
|
-
language: row.language as string | undefined,
|
|
19
|
-
properties: row.properties ? JSON.parse(row.properties as string) : undefined,
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// ── Output type ────────────────────────────────────────────────────────────────
|
|
24
|
-
|
|
25
|
-
export interface MonographRenameResult {
|
|
26
|
-
symbol: MonographNode | null;
|
|
27
|
-
referencingFiles: string[];
|
|
28
|
-
changes: Array<{ file: string; line: number; before: string; after: string }>;
|
|
29
|
-
error?: string;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// ── Implementation ─────────────────────────────────────────────────────────────
|
|
33
|
-
|
|
34
|
-
export function getMonographRename(
|
|
35
|
-
db: Database.Database,
|
|
36
|
-
input: { oldName: string; newName: string; filePath?: string; dryRun?: boolean },
|
|
37
|
-
): MonographRenameResult {
|
|
38
|
-
// Find the canonical node
|
|
39
|
-
let nodeRow: Record<string, unknown> | undefined;
|
|
40
|
-
if (input.filePath) {
|
|
41
|
-
nodeRow = db
|
|
42
|
-
.prepare('SELECT * FROM nodes WHERE name = ? AND file_path = ? LIMIT 1')
|
|
43
|
-
.get(input.oldName, input.filePath) as Record<string, unknown> | undefined;
|
|
44
|
-
} else {
|
|
45
|
-
nodeRow = db
|
|
46
|
-
.prepare('SELECT * FROM nodes WHERE name = ? LIMIT 1')
|
|
47
|
-
.get(input.oldName) as Record<string, unknown> | undefined;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
if (!nodeRow) {
|
|
51
|
-
return { symbol: null, referencingFiles: [], changes: [] };
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const symbol = rowToNode(nodeRow);
|
|
55
|
-
const nodeId = symbol.id;
|
|
56
|
-
|
|
57
|
-
// Find all nodes with CALLS or IMPORTS edges pointing to this node
|
|
58
|
-
const referencingRows = db
|
|
59
|
-
.prepare(
|
|
60
|
-
`SELECT DISTINCT n.id, n.file_path, n.start_line FROM nodes n
|
|
61
|
-
JOIN edges e ON n.id = e.source_id
|
|
62
|
-
WHERE e.target_id = ? AND e.relation IN ('CALLS', 'IMPORTS')
|
|
63
|
-
AND n.file_path IS NOT NULL`,
|
|
64
|
-
)
|
|
65
|
-
.all(nodeId) as Array<{ id: string; file_path: string; start_line: number | null }>;
|
|
66
|
-
|
|
67
|
-
const referencingFiles = [...new Set(referencingRows.map(r => r.file_path))];
|
|
68
|
-
|
|
69
|
-
// Build changes list by reading source files
|
|
70
|
-
const changes: Array<{ file: string; line: number; before: string; after: string }> = [];
|
|
71
|
-
// Two separate regexes: testRe has no `g` flag (safe for repeated test()), replaceRe has `g`
|
|
72
|
-
const testRe = new RegExp(`\\b${escapeRegExp(input.oldName)}\\b`);
|
|
73
|
-
const replaceRe = new RegExp(`\\b${escapeRegExp(input.oldName)}\\b`, 'g');
|
|
74
|
-
const MAX_FILE_BYTES = 1_048_576; // 1 MiB guard
|
|
75
|
-
|
|
76
|
-
// File line cache to avoid re-reading the same file multiple times
|
|
77
|
-
const fileLineCache = new Map<string, string[]>();
|
|
78
|
-
|
|
79
|
-
const getLines = (filePath: string): string[] => {
|
|
80
|
-
if (fileLineCache.has(filePath)) return fileLineCache.get(filePath)!;
|
|
81
|
-
try {
|
|
82
|
-
const st = statSync(filePath);
|
|
83
|
-
if (st.size > MAX_FILE_BYTES) { fileLineCache.set(filePath, []); return []; }
|
|
84
|
-
const content = readFileSync(filePath, 'utf-8');
|
|
85
|
-
const lines = content.split('\n');
|
|
86
|
-
fileLineCache.set(filePath, lines);
|
|
87
|
-
return lines;
|
|
88
|
-
} catch {
|
|
89
|
-
fileLineCache.set(filePath, []);
|
|
90
|
-
return [];
|
|
91
|
-
}
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
for (const row of referencingRows) {
|
|
95
|
-
if (!row.file_path || row.start_line == null) continue;
|
|
96
|
-
|
|
97
|
-
const lines = getLines(row.file_path);
|
|
98
|
-
const lineIdx = row.start_line - 1; // convert 1-based to 0-based
|
|
99
|
-
if (lineIdx < 0 || lineIdx >= lines.length) continue;
|
|
100
|
-
|
|
101
|
-
const originalLine = lines[lineIdx];
|
|
102
|
-
if (!testRe.test(originalLine)) continue;
|
|
103
|
-
|
|
104
|
-
const updatedLine = originalLine.replace(replaceRe, input.newName);
|
|
105
|
-
changes.push({
|
|
106
|
-
file: row.file_path,
|
|
107
|
-
line: row.start_line,
|
|
108
|
-
before: originalLine,
|
|
109
|
-
after: updatedLine,
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
return { symbol, referencingFiles, changes };
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
function escapeRegExp(str: string): string {
|
|
117
|
-
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
118
|
-
}
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import { readFileSync, statSync } from 'fs';
|
|
2
|
-
import type Database from 'better-sqlite3';
|
|
3
|
-
import { extractMiddlewareChain } from '../pipeline/phases/middleware-extractor.js';
|
|
4
|
-
|
|
5
|
-
// ── Output types ───────────────────────────────────────────────────────────────
|
|
6
|
-
|
|
7
|
-
export interface RouteMapEntry {
|
|
8
|
-
method: string;
|
|
9
|
-
path: string;
|
|
10
|
-
handlerName: string | null;
|
|
11
|
-
handlerFile: string | null;
|
|
12
|
-
handlerLine: number | null;
|
|
13
|
-
routeNodeId: string;
|
|
14
|
-
middlewareChain: string[];
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export interface MonographRouteMapResult {
|
|
18
|
-
routes: RouteMapEntry[];
|
|
19
|
-
total: number;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const MAX_FILE_BYTES = 1_048_576; // 1 MiB guard for middleware source reads
|
|
23
|
-
|
|
24
|
-
// ── Implementation ─────────────────────────────────────────────────────────────
|
|
25
|
-
|
|
26
|
-
export function getMonographRouteMap(
|
|
27
|
-
db: Database.Database,
|
|
28
|
-
input: { prefix?: string; method?: string; includeMiddleware?: boolean; repoPath?: string },
|
|
29
|
-
): MonographRouteMapResult {
|
|
30
|
-
// 1. Build SQL-level filters to avoid loading the whole Route table into JS
|
|
31
|
-
const conditions: string[] = ["label = 'Route'"];
|
|
32
|
-
const params: unknown[] = [];
|
|
33
|
-
|
|
34
|
-
if (input.prefix) {
|
|
35
|
-
// Route name format: "METHOD /path" — prefix applies to path portion after first space
|
|
36
|
-
conditions.push("name LIKE ?");
|
|
37
|
-
params.push(`% ${input.prefix}%`);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
if (input.method) {
|
|
41
|
-
const methodUpper = input.method.toUpperCase();
|
|
42
|
-
conditions.push("(name LIKE ? OR name LIKE ?)");
|
|
43
|
-
params.push(`${methodUpper} %`, 'ANY %');
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const sql = `SELECT * FROM nodes WHERE ${conditions.join(' AND ')}`;
|
|
47
|
-
const routeRows = db.prepare(sql).all(...params) as Record<string, unknown>[];
|
|
48
|
-
|
|
49
|
-
// 2. For each route, find handler via HANDLES_ROUTE edge (prepared once)
|
|
50
|
-
const handlerStmt = db.prepare(
|
|
51
|
-
`SELECT n.name, n.file_path, n.start_line FROM nodes n
|
|
52
|
-
JOIN edges e ON n.id = e.target_id
|
|
53
|
-
WHERE e.source_id = ? AND e.relation = 'HANDLES_ROUTE'
|
|
54
|
-
LIMIT 1`,
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
const routes: RouteMapEntry[] = routeRows.map((row) => {
|
|
58
|
-
const routeNodeId = row.id as string;
|
|
59
|
-
const name = row.name as string;
|
|
60
|
-
|
|
61
|
-
// Parse method and path from name (format: "METHOD /path")
|
|
62
|
-
const spaceIdx = name.indexOf(' ');
|
|
63
|
-
const method = spaceIdx >= 0 ? name.slice(0, spaceIdx) : 'ANY';
|
|
64
|
-
const path = spaceIdx >= 0 ? name.slice(spaceIdx + 1) : name;
|
|
65
|
-
|
|
66
|
-
// Look up handler
|
|
67
|
-
const handlerRow = handlerStmt.get(routeNodeId) as
|
|
68
|
-
| { name: string; file_path: string | null; start_line: number | null }
|
|
69
|
-
| undefined;
|
|
70
|
-
|
|
71
|
-
// Detect middleware chain at query time when requested
|
|
72
|
-
let middlewareChain: string[] = [];
|
|
73
|
-
if (input.includeMiddleware && input.repoPath && handlerRow?.name && handlerRow?.file_path) {
|
|
74
|
-
try {
|
|
75
|
-
const absPath = `${input.repoPath}/${handlerRow.file_path}`;
|
|
76
|
-
const st = statSync(absPath);
|
|
77
|
-
if (st.size <= MAX_FILE_BYTES) {
|
|
78
|
-
const source = readFileSync(absPath, 'utf-8');
|
|
79
|
-
middlewareChain = extractMiddlewareChain(source, handlerRow.name).middlewareNames;
|
|
80
|
-
}
|
|
81
|
-
} catch {
|
|
82
|
-
// File not found, unreadable, or too large — leave middlewareChain as []
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return {
|
|
87
|
-
method,
|
|
88
|
-
path,
|
|
89
|
-
handlerName: handlerRow?.name ?? null,
|
|
90
|
-
handlerFile: handlerRow?.file_path ?? null,
|
|
91
|
-
handlerLine: handlerRow?.start_line ?? null,
|
|
92
|
-
routeNodeId,
|
|
93
|
-
middlewareChain,
|
|
94
|
-
};
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
return { routes, total: routes.length };
|
|
98
|
-
}
|
package/src/mcp-tools/serve.ts
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import type Database from 'better-sqlite3';
|
|
2
|
-
import { startServer, isServerRunning, getActiveUrl } from '../web/server.js';
|
|
3
|
-
|
|
4
|
-
export interface ServeOptions {
|
|
5
|
-
port?: number;
|
|
6
|
-
open?: boolean;
|
|
7
|
-
db: Database.Database;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export interface ServeResult {
|
|
11
|
-
url: string;
|
|
12
|
-
status: 'started' | 'already_running';
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Start the Monograph web UI server.
|
|
17
|
-
* If the server is already running, returns the existing URL.
|
|
18
|
-
*/
|
|
19
|
-
export async function serveMonograph(options: ServeOptions): Promise<ServeResult> {
|
|
20
|
-
const { port = 7374, open = false, db } = options;
|
|
21
|
-
|
|
22
|
-
if (isServerRunning()) {
|
|
23
|
-
const url = getActiveUrl() ?? `http://localhost:${port}`;
|
|
24
|
-
return { url, status: 'already_running' };
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const handle = await startServer({ port, db });
|
|
28
|
-
|
|
29
|
-
if (open) {
|
|
30
|
-
// Use spawn with an argument array to avoid shell injection via URL characters
|
|
31
|
-
const { spawn } = await import('child_process');
|
|
32
|
-
const [bin, ...args] = process.platform === 'win32'
|
|
33
|
-
? ['cmd', '/c', 'start', '', handle.url]
|
|
34
|
-
: process.platform === 'darwin'
|
|
35
|
-
? ['open', handle.url]
|
|
36
|
-
: ['xdg-open', handle.url];
|
|
37
|
-
spawn(bin as string, args, { stdio: 'ignore', detached: true }).unref();
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return { url: handle.url, status: 'started' };
|
|
41
|
-
}
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
import { readFileSync, statSync } from 'fs';
|
|
2
|
-
import { join } from 'path';
|
|
3
|
-
import type Database from 'better-sqlite3';
|
|
4
|
-
import {
|
|
5
|
-
extractHandlerReturnKeys,
|
|
6
|
-
extractAccessedKeys,
|
|
7
|
-
compareShapes,
|
|
8
|
-
type RouteShape,
|
|
9
|
-
} from '../analysis/shape-extractor.js';
|
|
10
|
-
|
|
11
|
-
// ── Output types ───────────────────────────────────────────────────────────────
|
|
12
|
-
|
|
13
|
-
export interface ShapeCheckResult {
|
|
14
|
-
route: {
|
|
15
|
-
path: string;
|
|
16
|
-
method: string;
|
|
17
|
-
handlerName: string;
|
|
18
|
-
handlerFile: string;
|
|
19
|
-
} | null;
|
|
20
|
-
shape: RouteShape;
|
|
21
|
-
consumers: { name: string; filePath: string }[];
|
|
22
|
-
message: string;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// ── Internal helpers ───────────────────────────────────────────────────────────
|
|
26
|
-
|
|
27
|
-
const MAX_FILE_BYTES = 1_048_576; // 1 MiB guard
|
|
28
|
-
|
|
29
|
-
function safeReadFile(absPath: string): string {
|
|
30
|
-
try {
|
|
31
|
-
const st = statSync(absPath);
|
|
32
|
-
if (st.size > MAX_FILE_BYTES) return '';
|
|
33
|
-
return readFileSync(absPath, 'utf-8');
|
|
34
|
-
} catch {
|
|
35
|
-
return '';
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// ── Implementation ─────────────────────────────────────────────────────────────
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Check whether the JSON shape returned by a route handler matches what its
|
|
43
|
-
* consumers actually access.
|
|
44
|
-
*
|
|
45
|
-
* @param db - Open monograph SQLite database
|
|
46
|
-
* @param repoPath - Absolute path to repository root (used to resolve file_path)
|
|
47
|
-
* @param options - `route` searches by route name/path substring;
|
|
48
|
-
* `file` searches by exact file_path of the Route node
|
|
49
|
-
*/
|
|
50
|
-
export function getShapeCheck(
|
|
51
|
-
db: Database.Database,
|
|
52
|
-
repoPath: string,
|
|
53
|
-
options: { route?: string; file?: string },
|
|
54
|
-
): ShapeCheckResult {
|
|
55
|
-
const UNKNOWN_SHAPE: RouteShape = {
|
|
56
|
-
returnedKeys: [],
|
|
57
|
-
accessedKeys: [],
|
|
58
|
-
mismatches: [],
|
|
59
|
-
extra: [],
|
|
60
|
-
status: 'UNKNOWN',
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
// 1. Find the Route node
|
|
64
|
-
let routeRow: Record<string, unknown> | undefined;
|
|
65
|
-
|
|
66
|
-
if (options.file) {
|
|
67
|
-
routeRow = db
|
|
68
|
-
.prepare("SELECT * FROM nodes WHERE label = 'Route' AND file_path = ? LIMIT 1")
|
|
69
|
-
.get(options.file) as Record<string, unknown> | undefined;
|
|
70
|
-
} else if (options.route) {
|
|
71
|
-
// Search by name substring (name is like "GET /api/users") using SQL LIKE to avoid full scan
|
|
72
|
-
// The route path follows the first space, so we match anywhere after it via a LIKE pattern.
|
|
73
|
-
const likeTerm = `% ${options.route.toLowerCase()}%`;
|
|
74
|
-
routeRow = db
|
|
75
|
-
.prepare("SELECT * FROM nodes WHERE label = 'Route' AND lower(name) LIKE ? LIMIT 1")
|
|
76
|
-
.get(likeTerm) as Record<string, unknown> | undefined;
|
|
77
|
-
|
|
78
|
-
// Fallback: match anywhere in the name (e.g. no space prefix)
|
|
79
|
-
if (!routeRow) {
|
|
80
|
-
routeRow = db
|
|
81
|
-
.prepare("SELECT * FROM nodes WHERE label = 'Route' AND lower(name) LIKE ? LIMIT 1")
|
|
82
|
-
.get(`%${options.route.toLowerCase()}%`) as Record<string, unknown> | undefined;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
if (!routeRow) {
|
|
87
|
-
return {
|
|
88
|
-
route: null,
|
|
89
|
-
shape: UNKNOWN_SHAPE,
|
|
90
|
-
consumers: [],
|
|
91
|
-
message: 'Route not found',
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
const routeId = routeRow.id as string;
|
|
96
|
-
const routeName = routeRow.name as string;
|
|
97
|
-
const spaceIdx = routeName.indexOf(' ');
|
|
98
|
-
const method = spaceIdx >= 0 ? routeName.slice(0, spaceIdx) : 'ANY';
|
|
99
|
-
const routePath = spaceIdx >= 0 ? routeName.slice(spaceIdx + 1) : routeName;
|
|
100
|
-
|
|
101
|
-
// 2. Follow HANDLES_ROUTE edge to find the handler function node
|
|
102
|
-
const handlerRow = db
|
|
103
|
-
.prepare(
|
|
104
|
-
`SELECT n.id, n.name, n.file_path FROM nodes n
|
|
105
|
-
JOIN edges e ON n.id = e.target_id
|
|
106
|
-
WHERE e.source_id = ? AND e.relation = 'HANDLES_ROUTE'
|
|
107
|
-
LIMIT 1`,
|
|
108
|
-
)
|
|
109
|
-
.get(routeId) as { id: string; name: string; file_path: string | null } | undefined;
|
|
110
|
-
|
|
111
|
-
if (!handlerRow || !handlerRow.file_path) {
|
|
112
|
-
return {
|
|
113
|
-
route: {
|
|
114
|
-
path: routePath,
|
|
115
|
-
method,
|
|
116
|
-
handlerName: handlerRow?.name ?? '',
|
|
117
|
-
handlerFile: handlerRow?.file_path ?? '',
|
|
118
|
-
},
|
|
119
|
-
shape: UNKNOWN_SHAPE,
|
|
120
|
-
consumers: [],
|
|
121
|
-
message: 'Handler not found or has no source file',
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// 3. Read handler source and extract return keys
|
|
126
|
-
const handlerAbsPath = join(repoPath, handlerRow.file_path);
|
|
127
|
-
const handlerSource = safeReadFile(handlerAbsPath);
|
|
128
|
-
const returnedKeys = extractHandlerReturnKeys(handlerSource);
|
|
129
|
-
|
|
130
|
-
// 4. Find consumers: functions that CALLS or FETCHES the handler node,
|
|
131
|
-
// or that FETCHES the Route node directly
|
|
132
|
-
const consumerRows = db
|
|
133
|
-
.prepare(
|
|
134
|
-
`SELECT DISTINCT n.id, n.name, n.file_path FROM nodes n
|
|
135
|
-
JOIN edges e ON n.id = e.source_id
|
|
136
|
-
WHERE (
|
|
137
|
-
(e.target_id = ? AND (e.relation = 'CALLS' OR e.relation = 'FETCHES'))
|
|
138
|
-
OR
|
|
139
|
-
(e.target_id = ? AND e.relation = 'FETCHES')
|
|
140
|
-
)
|
|
141
|
-
AND n.file_path IS NOT NULL`,
|
|
142
|
-
)
|
|
143
|
-
.all(handlerRow.id, routeId) as { id: string; name: string; file_path: string }[];
|
|
144
|
-
|
|
145
|
-
// 5. Extract accessed keys from each consumer's source
|
|
146
|
-
const allAccessedKeys = new Set<string>();
|
|
147
|
-
|
|
148
|
-
for (const consumer of consumerRows) {
|
|
149
|
-
const consumerAbsPath = join(repoPath, consumer.file_path);
|
|
150
|
-
const consumerSource = safeReadFile(consumerAbsPath);
|
|
151
|
-
const accessed = extractAccessedKeys(consumerSource);
|
|
152
|
-
for (const k of accessed) allAccessedKeys.add(k);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
// 6. Compare shapes
|
|
156
|
-
const accessedKeys = Array.from(allAccessedKeys).sort();
|
|
157
|
-
const shape = compareShapes(returnedKeys, accessedKeys);
|
|
158
|
-
|
|
159
|
-
const consumers = consumerRows.map((c) => ({
|
|
160
|
-
name: c.name,
|
|
161
|
-
filePath: c.file_path,
|
|
162
|
-
}));
|
|
163
|
-
|
|
164
|
-
const statusMsg =
|
|
165
|
-
shape.status === 'MATCH'
|
|
166
|
-
? 'Shape matches: all accessed keys are returned by handler'
|
|
167
|
-
: shape.status === 'MISMATCH'
|
|
168
|
-
? `Shape mismatch: ${shape.mismatches.join(', ')} accessed but not returned`
|
|
169
|
-
: 'Shape unknown: insufficient source information';
|
|
170
|
-
|
|
171
|
-
return {
|
|
172
|
-
route: {
|
|
173
|
-
path: routePath,
|
|
174
|
-
method,
|
|
175
|
-
handlerName: handlerRow.name,
|
|
176
|
-
handlerFile: handlerRow.file_path,
|
|
177
|
-
},
|
|
178
|
-
shape,
|
|
179
|
-
consumers,
|
|
180
|
-
message: statusMsg,
|
|
181
|
-
};
|
|
182
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { openDb } from '../storage/db.js';
|
|
2
|
-
import { checkStaleness, type StalenessReport } from '../staleness/git-staleness.js';
|
|
3
|
-
|
|
4
|
-
export async function getMonographStaleness(repoPath: string): Promise<StalenessReport> {
|
|
5
|
-
const { join } = await import('path');
|
|
6
|
-
const dbPath = join(repoPath, '.monomind', 'monograph.db');
|
|
7
|
-
const db = openDb(dbPath);
|
|
8
|
-
try {
|
|
9
|
-
return checkStaleness(db, repoPath);
|
|
10
|
-
} finally {
|
|
11
|
-
db.close();
|
|
12
|
-
}
|
|
13
|
-
}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import type Database from 'better-sqlite3';
|
|
2
|
-
|
|
3
|
-
// ── Output types ───────────────────────────────────────────────────────────────
|
|
4
|
-
|
|
5
|
-
export interface ToolEntry {
|
|
6
|
-
id: string;
|
|
7
|
-
name: string;
|
|
8
|
-
description: string | null;
|
|
9
|
-
filePath: string | null;
|
|
10
|
-
handlerName: string | null;
|
|
11
|
-
handlerFile: string | null;
|
|
12
|
-
handlerLine: number | null;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
// ── Implementation ─────────────────────────────────────────────────────────────
|
|
16
|
-
|
|
17
|
-
export function getToolMap(
|
|
18
|
-
db: Database.Database,
|
|
19
|
-
options?: { tool?: string },
|
|
20
|
-
): ToolEntry[] {
|
|
21
|
-
const toolFilter = options?.tool ?? null;
|
|
22
|
-
|
|
23
|
-
const rows = db
|
|
24
|
-
.prepare(
|
|
25
|
-
`SELECT t.id, t.name, t.properties, t.file_path,
|
|
26
|
-
h.name as handler_name, h.file_path as handler_file, h.start_line as handler_line
|
|
27
|
-
FROM nodes t
|
|
28
|
-
LEFT JOIN edges e ON e.source_id = t.id AND e.relation = 'HANDLES_TOOL'
|
|
29
|
-
LEFT JOIN nodes h ON h.id = e.target_id
|
|
30
|
-
WHERE t.label = 'Tool'
|
|
31
|
-
AND (? IS NULL OR t.name LIKE '%' || ? || '%')
|
|
32
|
-
ORDER BY t.name
|
|
33
|
-
LIMIT 100`,
|
|
34
|
-
)
|
|
35
|
-
.all(toolFilter, toolFilter) as Array<{
|
|
36
|
-
id: string;
|
|
37
|
-
name: string;
|
|
38
|
-
properties: string | null;
|
|
39
|
-
file_path: string | null;
|
|
40
|
-
handler_name: string | null;
|
|
41
|
-
handler_file: string | null;
|
|
42
|
-
handler_line: number | null;
|
|
43
|
-
}>;
|
|
44
|
-
|
|
45
|
-
return rows.map((row) => {
|
|
46
|
-
let description: string | null = null;
|
|
47
|
-
if (row.properties) {
|
|
48
|
-
try {
|
|
49
|
-
const props = JSON.parse(row.properties) as Record<string, unknown>;
|
|
50
|
-
description = typeof props['description'] === 'string' ? props['description'] : null;
|
|
51
|
-
} catch {
|
|
52
|
-
// ignore malformed JSON
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
return {
|
|
57
|
-
id: row.id,
|
|
58
|
-
name: row.name,
|
|
59
|
-
description,
|
|
60
|
-
filePath: row.file_path ?? null,
|
|
61
|
-
handlerName: row.handler_name ?? null,
|
|
62
|
-
handlerFile: row.handler_file ?? null,
|
|
63
|
-
handlerLine: row.handler_line ?? null,
|
|
64
|
-
};
|
|
65
|
-
});
|
|
66
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import type { MonographDb } from '../storage/db.js';
|
|
2
|
-
import type { LlmClient, GenerateAllWikiPagesOptions } from '../wiki/wiki-generator.js';
|
|
3
|
-
import { generateAllWikiPages } from '../wiki/wiki-generator.js';
|
|
4
|
-
|
|
5
|
-
export interface WikiBuildToolInput {
|
|
6
|
-
communityId?: string;
|
|
7
|
-
force?: boolean;
|
|
8
|
-
model?: string;
|
|
9
|
-
/** Injected LLM client for testing (not part of MCP schema) */
|
|
10
|
-
llmClient?: LlmClient;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export interface WikiBuildToolResult {
|
|
14
|
-
generated?: number;
|
|
15
|
-
skipped?: number;
|
|
16
|
-
errors?: number;
|
|
17
|
-
error?: string;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* monograph_wiki_build MCP tool handler.
|
|
22
|
-
* Generates wiki pages for communities using the LLM.
|
|
23
|
-
*/
|
|
24
|
-
export async function runWikiBuildTool(
|
|
25
|
-
db: MonographDb,
|
|
26
|
-
input: WikiBuildToolInput,
|
|
27
|
-
): Promise<WikiBuildToolResult> {
|
|
28
|
-
const opts: GenerateAllWikiPagesOptions = {
|
|
29
|
-
force: input.force ?? false,
|
|
30
|
-
model: input.model,
|
|
31
|
-
communityId: input.communityId,
|
|
32
|
-
llmClient: input.llmClient,
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
const result = await generateAllWikiPages(db, opts);
|
|
36
|
-
return result;
|
|
37
|
-
}
|
package/src/mcp-tools/wiki.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import type { MonographDb } from '../storage/db.js';
|
|
2
|
-
import { getWikiPage, listWikiPages } from '../wiki/wiki-store.js';
|
|
3
|
-
|
|
4
|
-
export interface WikiToolInput {
|
|
5
|
-
communityId?: string;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export interface WikiPage {
|
|
9
|
-
communityId: string;
|
|
10
|
-
content: string;
|
|
11
|
-
generatedAt: string;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export interface WikiToolResult {
|
|
15
|
-
pages: WikiPage[];
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* monograph_wiki MCP tool handler.
|
|
20
|
-
* Returns one wiki page (by communityId) or all pages.
|
|
21
|
-
*/
|
|
22
|
-
export function getWikiToolResult(db: MonographDb, input: WikiToolInput): WikiToolResult {
|
|
23
|
-
if (input.communityId != null) {
|
|
24
|
-
const page = getWikiPage(db, String(input.communityId));
|
|
25
|
-
return { pages: page ? [page] : [] };
|
|
26
|
-
}
|
|
27
|
-
return { pages: listWikiPages(db) };
|
|
28
|
-
}
|
package/src/migrate/jscpd.ts
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { readFileSync, existsSync } from 'fs';
|
|
2
|
-
export type { MigrationWarning } from './knip.js';
|
|
3
|
-
import type { MigrationWarning } from './knip.js';
|
|
4
|
-
|
|
5
|
-
export interface JscpdMigrationResult {
|
|
6
|
-
monographConfig: Record<string, unknown>;
|
|
7
|
-
warnings: MigrationWarning[];
|
|
8
|
-
inputFile: string;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
const JSCPD_REPORTERS_WARNING = 'Use monograph --format sarif|codeclimate|markdown instead';
|
|
12
|
-
|
|
13
|
-
export function migrateFromJscpd(jscpdConfigPath: string): JscpdMigrationResult {
|
|
14
|
-
if (!existsSync(jscpdConfigPath)) {
|
|
15
|
-
throw new Error(`jscpd config not found: ${jscpdConfigPath}`);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const raw = readFileSync(jscpdConfigPath, 'utf-8');
|
|
19
|
-
const warnings: MigrationWarning[] = [];
|
|
20
|
-
const monographConfig: Record<string, unknown> = {};
|
|
21
|
-
|
|
22
|
-
let jscpdConfig: Record<string, unknown>;
|
|
23
|
-
try {
|
|
24
|
-
jscpdConfig = JSON.parse(raw);
|
|
25
|
-
} catch {
|
|
26
|
-
warnings.push({
|
|
27
|
-
field: '<file>',
|
|
28
|
-
message: 'Failed to parse config as JSON',
|
|
29
|
-
knipValue: raw.slice(0, 100),
|
|
30
|
-
});
|
|
31
|
-
return { monographConfig, warnings, inputFile: jscpdConfigPath };
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const knownFields = new Set([
|
|
35
|
-
'threshold',
|
|
36
|
-
'minTokens',
|
|
37
|
-
'ignore',
|
|
38
|
-
'reporters',
|
|
39
|
-
'languages',
|
|
40
|
-
'gitignore',
|
|
41
|
-
]);
|
|
42
|
-
|
|
43
|
-
for (const [key, value] of Object.entries(jscpdConfig)) {
|
|
44
|
-
switch (key) {
|
|
45
|
-
case 'threshold':
|
|
46
|
-
monographConfig['cloneThreshold'] = value;
|
|
47
|
-
break;
|
|
48
|
-
case 'minTokens':
|
|
49
|
-
monographConfig['cloneMinTokens'] = value;
|
|
50
|
-
break;
|
|
51
|
-
case 'ignore':
|
|
52
|
-
monographConfig['exclude'] = value;
|
|
53
|
-
break;
|
|
54
|
-
case 'reporters':
|
|
55
|
-
warnings.push({
|
|
56
|
-
field: key,
|
|
57
|
-
message: JSCPD_REPORTERS_WARNING,
|
|
58
|
-
knipValue: value,
|
|
59
|
-
});
|
|
60
|
-
break;
|
|
61
|
-
case 'languages':
|
|
62
|
-
monographConfig['languages'] = value;
|
|
63
|
-
break;
|
|
64
|
-
case 'gitignore':
|
|
65
|
-
monographConfig['respectGitignore'] = value;
|
|
66
|
-
break;
|
|
67
|
-
default:
|
|
68
|
-
warnings.push({
|
|
69
|
-
field: key,
|
|
70
|
-
message: 'No equivalent in monograph config',
|
|
71
|
-
knipValue: value,
|
|
72
|
-
});
|
|
73
|
-
break;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
return { monographConfig, warnings, inputFile: jscpdConfigPath };
|
|
78
|
-
}
|