@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/cli/doctor.ts
DELETED
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* runDoctor — Platform health checks for the Monograph knowledge graph.
|
|
3
|
-
*
|
|
4
|
-
* Checks:
|
|
5
|
-
* 1. Node.js version (must be >= 18)
|
|
6
|
-
* 2. SQLite DB file exists at .monomind/monograph.db
|
|
7
|
-
* 3. SQLite DB is readable (SELECT 1)
|
|
8
|
-
* 4. DB node count (warns if graph not built)
|
|
9
|
-
* 5. Disk space (warns if < 100 MB free)
|
|
10
|
-
* 6. Tree-sitter availability
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import { existsSync, statfsSync } from 'fs';
|
|
14
|
-
import { join } from 'path';
|
|
15
|
-
|
|
16
|
-
export interface DoctorCheck {
|
|
17
|
-
name: string;
|
|
18
|
-
status: 'ok' | 'warn' | 'error';
|
|
19
|
-
message: string;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface DoctorResult {
|
|
23
|
-
checks: DoctorCheck[];
|
|
24
|
-
/** true if no 'error' level checks */
|
|
25
|
-
healthy: boolean;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// ─── Individual checks ────────────────────────────────────────────────────────
|
|
29
|
-
|
|
30
|
-
function checkNodeVersion(): DoctorCheck {
|
|
31
|
-
const raw = process.version; // e.g. 'v20.1.0'
|
|
32
|
-
const major = parseInt(raw.replace(/^v/, '').split('.')[0], 10);
|
|
33
|
-
if (major >= 18) {
|
|
34
|
-
return { name: 'Node version', status: 'ok', message: `${raw} (>= 18 required)` };
|
|
35
|
-
}
|
|
36
|
-
return {
|
|
37
|
-
name: 'Node version',
|
|
38
|
-
status: 'error',
|
|
39
|
-
message: `${raw} — Node >= 18 is required`,
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function checkDbExists(dbPath: string): DoctorCheck {
|
|
44
|
-
if (existsSync(dbPath)) {
|
|
45
|
-
return { name: 'SQLite DB exists', status: 'ok', message: dbPath };
|
|
46
|
-
}
|
|
47
|
-
return {
|
|
48
|
-
name: 'SQLite DB exists',
|
|
49
|
-
status: 'error',
|
|
50
|
-
message: `DB not found at ${dbPath} — run monograph build first`,
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
async function checkDbReadable(dbPath: string): Promise<DoctorCheck> {
|
|
55
|
-
try {
|
|
56
|
-
const Database = (await import('better-sqlite3')).default;
|
|
57
|
-
const db = new Database(dbPath, { readonly: true });
|
|
58
|
-
db.prepare('SELECT 1').get();
|
|
59
|
-
db.close();
|
|
60
|
-
return { name: 'SQLite DB readable', status: 'ok', message: 'SELECT 1 passed' };
|
|
61
|
-
} catch (err: unknown) {
|
|
62
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
63
|
-
return { name: 'SQLite DB readable', status: 'error', message: msg };
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
async function checkNodeCount(dbPath: string): Promise<DoctorCheck> {
|
|
68
|
-
try {
|
|
69
|
-
const Database = (await import('better-sqlite3')).default;
|
|
70
|
-
const db = new Database(dbPath, { readonly: true });
|
|
71
|
-
const row = db.prepare('SELECT COUNT(*) AS n FROM nodes').get() as { n: number } | undefined;
|
|
72
|
-
db.close();
|
|
73
|
-
const count = row?.n ?? 0;
|
|
74
|
-
if (count === 0) {
|
|
75
|
-
return {
|
|
76
|
-
name: 'DB node count',
|
|
77
|
-
status: 'warn',
|
|
78
|
-
message: '0 nodes — graph not built yet. Run monograph build.',
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
return { name: 'DB node count', status: 'ok', message: `${count} nodes indexed` };
|
|
82
|
-
} catch (err: unknown) {
|
|
83
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
84
|
-
return { name: 'DB node count', status: 'warn', message: `Could not read node count: ${msg}` };
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function checkDiskSpace(repoPath: string): DoctorCheck {
|
|
89
|
-
const MIN_FREE_BYTES = 100 * 1024 * 1024; // 100 MB
|
|
90
|
-
try {
|
|
91
|
-
if (typeof statfsSync !== 'function') {
|
|
92
|
-
return {
|
|
93
|
-
name: 'Disk space',
|
|
94
|
-
status: 'ok',
|
|
95
|
-
message: 'statfsSync not available on this platform — skipped',
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
const stats = statfsSync(repoPath);
|
|
99
|
-
const freeBytes = stats.bsize * stats.bavail;
|
|
100
|
-
const freeMB = Math.round(freeBytes / (1024 * 1024));
|
|
101
|
-
if (freeBytes < MIN_FREE_BYTES) {
|
|
102
|
-
return {
|
|
103
|
-
name: 'Disk space',
|
|
104
|
-
status: 'warn',
|
|
105
|
-
message: `Only ${freeMB} MB free — less than 100 MB recommended`,
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
return { name: 'Disk space', status: 'ok', message: `${freeMB} MB free` };
|
|
109
|
-
} catch {
|
|
110
|
-
// statfsSync may throw on some platforms (e.g. Windows)
|
|
111
|
-
return {
|
|
112
|
-
name: 'Disk space',
|
|
113
|
-
status: 'ok',
|
|
114
|
-
message: 'Disk space check not supported on this platform — skipped',
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
async function checkTreeSitter(): Promise<DoctorCheck> {
|
|
120
|
-
try {
|
|
121
|
-
await import('tree-sitter');
|
|
122
|
-
return { name: 'Tree-sitter', status: 'ok', message: 'tree-sitter module available' };
|
|
123
|
-
} catch {
|
|
124
|
-
return {
|
|
125
|
-
name: 'Tree-sitter',
|
|
126
|
-
status: 'warn',
|
|
127
|
-
message: 'tree-sitter not available — install it to enable code parsing',
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Run all platform health checks and return a structured result.
|
|
136
|
-
*
|
|
137
|
-
* @param repoPath - Absolute path to the repository root
|
|
138
|
-
* @returns DoctorResult with individual check outcomes and overall health
|
|
139
|
-
*
|
|
140
|
-
* @example
|
|
141
|
-
* const result = await runDoctor('/path/to/repo');
|
|
142
|
-
* if (!result.healthy) console.error('Some checks failed.');
|
|
143
|
-
*/
|
|
144
|
-
export async function runDoctor(repoPath: string): Promise<DoctorResult> {
|
|
145
|
-
const dbPath = join(repoPath, '.monomind', 'monograph.db');
|
|
146
|
-
|
|
147
|
-
const checks: DoctorCheck[] = [];
|
|
148
|
-
|
|
149
|
-
// 1. Node version
|
|
150
|
-
checks.push(checkNodeVersion());
|
|
151
|
-
|
|
152
|
-
// 2. DB file existence
|
|
153
|
-
const dbExistsCheck = checkDbExists(dbPath);
|
|
154
|
-
checks.push(dbExistsCheck);
|
|
155
|
-
|
|
156
|
-
// 3. DB readable (only if DB exists)
|
|
157
|
-
if (dbExistsCheck.status !== 'error') {
|
|
158
|
-
checks.push(await checkDbReadable(dbPath));
|
|
159
|
-
checks.push(await checkNodeCount(dbPath));
|
|
160
|
-
} else {
|
|
161
|
-
checks.push({
|
|
162
|
-
name: 'SQLite DB readable',
|
|
163
|
-
status: 'error',
|
|
164
|
-
message: 'Skipped — DB file not found',
|
|
165
|
-
});
|
|
166
|
-
checks.push({
|
|
167
|
-
name: 'DB node count',
|
|
168
|
-
status: 'error',
|
|
169
|
-
message: 'Skipped — DB file not found',
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// 4. Disk space
|
|
174
|
-
checks.push(checkDiskSpace(repoPath));
|
|
175
|
-
|
|
176
|
-
// 5. Tree-sitter
|
|
177
|
-
checks.push(await checkTreeSitter());
|
|
178
|
-
|
|
179
|
-
const healthy = checks.every((c) => c.status !== 'error');
|
|
180
|
-
|
|
181
|
-
return { checks, healthy };
|
|
182
|
-
}
|
package/src/cli/eval-server.ts
DELETED
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Eval Server — Lightweight HTTP server for CI/integration evaluation of monograph queries.
|
|
3
|
-
*
|
|
4
|
-
* Exposes /health, /query, and /search endpoints backed by the monograph DB.
|
|
5
|
-
* Designed for integration tests and evaluation scripts.
|
|
6
|
-
*
|
|
7
|
-
* Usage:
|
|
8
|
-
* createEvalServer('/path/to/repo')
|
|
9
|
-
* createEvalServer('/path/to/repo', 4848)
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { createRequire } from 'node:module';
|
|
13
|
-
import type { Server } from 'http';
|
|
14
|
-
import type { Application } from 'express';
|
|
15
|
-
import { openDb, closeDb } from '../storage/db.js';
|
|
16
|
-
import { querySearch, queryStats } from '../web/api.js';
|
|
17
|
-
import { hybridQuery } from '../search/hybrid-query.js';
|
|
18
|
-
import type { HybridResult } from '../search/hybrid-query.js';
|
|
19
|
-
import type { ApiNode } from '../web/api.js';
|
|
20
|
-
|
|
21
|
-
// ── Types ─────────────────────────────────────────────────────────────────────
|
|
22
|
-
|
|
23
|
-
export interface EvalServerHandle {
|
|
24
|
-
app: Application;
|
|
25
|
-
start(port: number): Promise<Server>;
|
|
26
|
-
stop(): void;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export type SearchResult = HybridResult;
|
|
30
|
-
|
|
31
|
-
// ── createEvalServer ──────────────────────────────────────────────────────────
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Create an eval server for a monograph DB at the given repo path.
|
|
35
|
-
*
|
|
36
|
-
* Returns an object with:
|
|
37
|
-
* - `app` — Express application (useful for supertest)
|
|
38
|
-
* - `start(port)` — begins listening; resolves with the Node http.Server
|
|
39
|
-
* - `stop()` — closes the DB and server
|
|
40
|
-
*/
|
|
41
|
-
export function createEvalServer(repoPath: string, _port?: number): EvalServerHandle {
|
|
42
|
-
const dbPath = `${repoPath}/.monomind/monograph.db`;
|
|
43
|
-
const db = openDb(dbPath);
|
|
44
|
-
|
|
45
|
-
let server: Server | null = null;
|
|
46
|
-
|
|
47
|
-
// Lazy-import express to keep startup fast
|
|
48
|
-
let _app: Application | null = null;
|
|
49
|
-
|
|
50
|
-
function getApp(): Application {
|
|
51
|
-
if (_app) return _app;
|
|
52
|
-
|
|
53
|
-
// createRequire, not a bare require(): this package is ESM
|
|
54
|
-
// ("type": "module"), where `require` is undefined at runtime — the
|
|
55
|
-
// eslint-disable that used to sit here silenced the lint but the call
|
|
56
|
-
// still threw "require is not defined" the moment getApp() ran.
|
|
57
|
-
// getApp() is synchronous, so `await import()` is not an option; this is
|
|
58
|
-
// the correct ESM escape hatch for a deliberately deferred load.
|
|
59
|
-
const require = createRequire(import.meta.url);
|
|
60
|
-
const express = require('express') as typeof import('express');
|
|
61
|
-
const app = express();
|
|
62
|
-
app.use(express.json());
|
|
63
|
-
|
|
64
|
-
// GET /health
|
|
65
|
-
app.get('/health', (_req, res) => {
|
|
66
|
-
try {
|
|
67
|
-
const stats = queryStats(db);
|
|
68
|
-
res.json({ status: 'ok', nodeCount: stats.nodeCount, edgeCount: stats.edgeCount });
|
|
69
|
-
} catch {
|
|
70
|
-
res.status(500).json({ status: 'error' });
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
// POST /query — text search returning MonographNode[]
|
|
75
|
-
app.post('/query', (req, res) => {
|
|
76
|
-
try {
|
|
77
|
-
const q: string = (req.body as { q?: string }).q ?? '';
|
|
78
|
-
const limit: number = (req.body as { limit?: number }).limit ?? 20;
|
|
79
|
-
const results: ApiNode[] = q.trim() ? querySearch(db, q).slice(0, limit) : [];
|
|
80
|
-
res.json({ results });
|
|
81
|
-
} catch (err) {
|
|
82
|
-
res.status(500).json({ error: String(err) });
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
// POST /search — hybrid BM25+vector search returning SearchResult[]
|
|
87
|
-
app.post('/search', async (req, res) => {
|
|
88
|
-
try {
|
|
89
|
-
const query: string = (req.body as { query?: string }).query ?? '';
|
|
90
|
-
const limit: number = (req.body as { limit?: number }).limit ?? 20;
|
|
91
|
-
const results: HybridResult[] = query.trim()
|
|
92
|
-
? await hybridQuery(db, query, { limit })
|
|
93
|
-
: [];
|
|
94
|
-
res.json({ results });
|
|
95
|
-
} catch (err) {
|
|
96
|
-
res.status(500).json({ error: String(err) });
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
_app = app;
|
|
101
|
-
return app;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
return {
|
|
105
|
-
get app(): Application {
|
|
106
|
-
return getApp();
|
|
107
|
-
},
|
|
108
|
-
|
|
109
|
-
start(port: number): Promise<Server> {
|
|
110
|
-
const app = getApp();
|
|
111
|
-
return new Promise((resolve, reject) => {
|
|
112
|
-
const s = app.listen(port, '127.0.0.1', () => resolve(s));
|
|
113
|
-
s.on('error', reject);
|
|
114
|
-
server = s;
|
|
115
|
-
});
|
|
116
|
-
},
|
|
117
|
-
|
|
118
|
-
stop(): void {
|
|
119
|
-
if (server) {
|
|
120
|
-
server.close();
|
|
121
|
-
server = null;
|
|
122
|
-
}
|
|
123
|
-
closeDb(db);
|
|
124
|
-
},
|
|
125
|
-
};
|
|
126
|
-
}
|
package/src/cli/hooks-install.ts
DELETED
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
existsSync,
|
|
3
|
-
writeFileSync,
|
|
4
|
-
chmodSync,
|
|
5
|
-
readdirSync,
|
|
6
|
-
readFileSync,
|
|
7
|
-
unlinkSync,
|
|
8
|
-
} from 'fs';
|
|
9
|
-
import { join } from 'path';
|
|
10
|
-
import { execSync } from 'child_process';
|
|
11
|
-
|
|
12
|
-
export const HOOK_MARKER_START = '# monograph-hook-start';
|
|
13
|
-
export const HOOK_MARKER_END = '# monograph-hook-end';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Rebase / merge / cherry-pick skip guard.
|
|
17
|
-
* Prevents the hook from running during interactive operations.
|
|
18
|
-
*/
|
|
19
|
-
const SKIP_GUARD = `# Skip during rebase, merge, or cherry-pick
|
|
20
|
-
if [ -d "$(git rev-parse --git-dir 2>/dev/null)/rebase-merge" ] || \\
|
|
21
|
-
[ -d "$(git rev-parse --git-dir 2>/dev/null)/rebase-apply" ] || \\
|
|
22
|
-
[ -f "$(git rev-parse --git-dir 2>/dev/null)/MERGE_HEAD" ] || \\
|
|
23
|
-
[ -f "$(git rev-parse --git-dir 2>/dev/null)/CHERRY_PICK_HEAD" ]; then
|
|
24
|
-
exit 0
|
|
25
|
-
fi`;
|
|
26
|
-
|
|
27
|
-
function buildHookBlock(hookName: string): string {
|
|
28
|
-
const verb =
|
|
29
|
-
hookName === 'post-merge' || hookName === 'post-checkout'
|
|
30
|
-
? 'rebuild knowledge graph after ' + hookName.replace('post-', '')
|
|
31
|
-
: 'rebuild knowledge graph on ' + hookName.replace('pre-', '');
|
|
32
|
-
|
|
33
|
-
return [
|
|
34
|
-
HOOK_MARKER_START,
|
|
35
|
-
`# Monograph: ${verb}`,
|
|
36
|
-
SKIP_GUARD,
|
|
37
|
-
'if command -v monograph >/dev/null 2>&1; then',
|
|
38
|
-
' monograph build --silent || true',
|
|
39
|
-
'elif command -v npx >/dev/null 2>&1; then',
|
|
40
|
-
' npx monograph build --silent || true',
|
|
41
|
-
'fi',
|
|
42
|
-
HOOK_MARKER_END,
|
|
43
|
-
].join('\n');
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Detect the git hooks directory, supporting Husky / custom `core.hooksPath`.
|
|
48
|
-
*/
|
|
49
|
-
function getHooksDir(repoPath: string): string {
|
|
50
|
-
try {
|
|
51
|
-
const custom = execSync('git config core.hooksPath', {
|
|
52
|
-
cwd: repoPath,
|
|
53
|
-
encoding: 'utf8',
|
|
54
|
-
stdio: ['ignore', 'pipe', 'ignore'],
|
|
55
|
-
}).trim();
|
|
56
|
-
if (custom) {
|
|
57
|
-
return join(repoPath, custom);
|
|
58
|
-
}
|
|
59
|
-
} catch {
|
|
60
|
-
// Not configured — fall through to default
|
|
61
|
-
}
|
|
62
|
-
return join(repoPath, '.git', 'hooks');
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Install (or update) monograph hooks by appending a marked block.
|
|
67
|
-
* Existing hook content is preserved. Re-running is idempotent.
|
|
68
|
-
*/
|
|
69
|
-
export function installGitHooks(repoPath: string, hooks: string[]): void {
|
|
70
|
-
const hooksDir = getHooksDir(repoPath);
|
|
71
|
-
if (!existsSync(hooksDir)) {
|
|
72
|
-
throw new Error(`No .git/hooks directory found at ${repoPath}`);
|
|
73
|
-
}
|
|
74
|
-
for (const hook of hooks) {
|
|
75
|
-
if (!/^[\w-]+$/.test(hook)) {
|
|
76
|
-
throw new Error(`Invalid hook name: "${hook}" — must be alphanumeric with hyphens only`);
|
|
77
|
-
}
|
|
78
|
-
const hookPath = join(hooksDir, hook);
|
|
79
|
-
const block = buildHookBlock(hook);
|
|
80
|
-
|
|
81
|
-
let existing = '';
|
|
82
|
-
if (existsSync(hookPath)) {
|
|
83
|
-
existing = readFileSync(hookPath, 'utf8');
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// Remove any existing monograph block (for idempotence)
|
|
87
|
-
const stripped = removeMarkerBlock(existing);
|
|
88
|
-
|
|
89
|
-
// If there was no prior content (beyond whitespace/shebang), start fresh with a shebang
|
|
90
|
-
const hasMeaningfulContent = stripped.replace(/^#!.*$/m, '').trim().length > 0;
|
|
91
|
-
const preamble = hasMeaningfulContent
|
|
92
|
-
? stripped.trimEnd() + '\n\n'
|
|
93
|
-
: '#!/bin/sh\n\n';
|
|
94
|
-
|
|
95
|
-
writeFileSync(hookPath, preamble + block + '\n', 'utf8');
|
|
96
|
-
chmodSync(hookPath, 0o755);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Remove the monograph marker block from hook content.
|
|
102
|
-
* Returns the content with the block stripped.
|
|
103
|
-
*/
|
|
104
|
-
function removeMarkerBlock(content: string): string {
|
|
105
|
-
const startIdx = content.indexOf(HOOK_MARKER_START);
|
|
106
|
-
const endIdx = content.indexOf(HOOK_MARKER_END);
|
|
107
|
-
if (startIdx === -1) return content;
|
|
108
|
-
const afterEnd = endIdx !== -1 ? content.slice(endIdx + HOOK_MARKER_END.length) : '';
|
|
109
|
-
return content.slice(0, startIdx) + afterEnd;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Uninstall monograph from hooks.
|
|
114
|
-
* Only removes the marker block — surrounding content is preserved.
|
|
115
|
-
* Removes the file entirely if nothing meaningful remains.
|
|
116
|
-
*/
|
|
117
|
-
export function uninstallGitHooks(repoPath: string, hooks: string[]): void {
|
|
118
|
-
const hooksDir = getHooksDir(repoPath);
|
|
119
|
-
for (const hook of hooks) {
|
|
120
|
-
if (!/^[\w-]+$/.test(hook)) {
|
|
121
|
-
throw new Error(`Invalid hook name: "${hook}" — must be alphanumeric with hyphens only`);
|
|
122
|
-
}
|
|
123
|
-
const hookPath = join(hooksDir, hook);
|
|
124
|
-
if (!existsSync(hookPath)) continue;
|
|
125
|
-
const original = readFileSync(hookPath, 'utf8');
|
|
126
|
-
if (!original.includes(HOOK_MARKER_START)) continue;
|
|
127
|
-
const stripped = removeMarkerBlock(original);
|
|
128
|
-
// If only a shebang (or whitespace) remains, the file was created entirely by us
|
|
129
|
-
const meaningful = stripped.replace(/^#!.*$/m, '').trim();
|
|
130
|
-
if (!meaningful) {
|
|
131
|
-
// Remove the file — nothing custom was there
|
|
132
|
-
try {
|
|
133
|
-
unlinkSync(hookPath);
|
|
134
|
-
} catch {
|
|
135
|
-
writeFileSync(hookPath, stripped, 'utf8');
|
|
136
|
-
}
|
|
137
|
-
} else {
|
|
138
|
-
writeFileSync(hookPath, stripped.trimEnd() + '\n', 'utf8');
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* List hook names that contain a monograph marker block.
|
|
145
|
-
*/
|
|
146
|
-
export function listInstalledHooks(repoPath: string): string[] {
|
|
147
|
-
const hooksDir = getHooksDir(repoPath);
|
|
148
|
-
if (!existsSync(hooksDir)) return [];
|
|
149
|
-
const installed: string[] = [];
|
|
150
|
-
for (const f of readdirSync(hooksDir)) {
|
|
151
|
-
try {
|
|
152
|
-
const content = readFileSync(join(hooksDir, f), 'utf8');
|
|
153
|
-
if (content.includes(HOOK_MARKER_START)) installed.push(f);
|
|
154
|
-
} catch { /* skip */ }
|
|
155
|
-
}
|
|
156
|
-
return installed;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
export interface PerHookStatus {
|
|
160
|
-
installed: boolean;
|
|
161
|
-
path: string;
|
|
162
|
-
hasCustomContent: boolean;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
export interface HookStatus {
|
|
166
|
-
installed: boolean;
|
|
167
|
-
hooks: string[];
|
|
168
|
-
hooksDir: string;
|
|
169
|
-
/** Per-hook details keyed by hook name. */
|
|
170
|
-
perHook?: Record<string, PerHookStatus>;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
export function getHookStatus(repoPath: string): HookStatus {
|
|
174
|
-
const hooksDir = getHooksDir(repoPath);
|
|
175
|
-
let installed: string[] = [];
|
|
176
|
-
try {
|
|
177
|
-
installed = listInstalledHooks(repoPath);
|
|
178
|
-
} catch { /* .git dir missing or unreadable */ }
|
|
179
|
-
|
|
180
|
-
// Build per-hook status for all known hooks + any installed ones
|
|
181
|
-
const knownHooks = ['pre-commit', 'post-merge', 'post-checkout', 'pre-push'];
|
|
182
|
-
const allHooks = new Set([...knownHooks, ...installed]);
|
|
183
|
-
const perHook: Record<string, PerHookStatus> = {};
|
|
184
|
-
for (const hook of allHooks) {
|
|
185
|
-
const hookPath = join(hooksDir, hook);
|
|
186
|
-
const isInstalled = installed.includes(hook);
|
|
187
|
-
let hasCustomContent = false;
|
|
188
|
-
if (existsSync(hookPath)) {
|
|
189
|
-
const content = readFileSync(hookPath, 'utf8');
|
|
190
|
-
const stripped = removeMarkerBlock(content);
|
|
191
|
-
hasCustomContent = stripped.replace(/^#!.*$/m, '').trim().length > 0;
|
|
192
|
-
}
|
|
193
|
-
perHook[hook] = { installed: isInstalled, path: hookPath, hasCustomContent };
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
return {
|
|
197
|
-
installed: installed.length > 0,
|
|
198
|
-
hooks: installed,
|
|
199
|
-
hooksDir,
|
|
200
|
-
perHook,
|
|
201
|
-
};
|
|
202
|
-
}
|
package/src/cli/setup.ts
DELETED
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* setupMonograph — Writes monograph MCP server configuration into AI tool
|
|
3
|
-
* config files (CLAUDE.md, AGENTS.md, .cursor/mcp.json) for a given repo.
|
|
4
|
-
*
|
|
5
|
-
* Running it multiple times is idempotent: if the config block is already
|
|
6
|
-
* present the file is left unchanged.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import fs from 'fs/promises';
|
|
10
|
-
import path from 'path';
|
|
11
|
-
|
|
12
|
-
export type SetupTool = 'claude' | 'cursor' | 'agents-md';
|
|
13
|
-
|
|
14
|
-
export interface SetupOptions {
|
|
15
|
-
/** Absolute path to the repository root */
|
|
16
|
-
repoPath: string;
|
|
17
|
-
/** Which tool configs to write. Defaults to all three. */
|
|
18
|
-
tools?: SetupTool[];
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export interface SetupResult {
|
|
22
|
-
/** Files that were written or updated */
|
|
23
|
-
configured: string[];
|
|
24
|
-
/** Files that were skipped because the config was already present */
|
|
25
|
-
skipped: string[];
|
|
26
|
-
/** Errors encountered (file not written) */
|
|
27
|
-
errors: string[];
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// ─── MCP server config ───────────────────────────────────────────────────────
|
|
31
|
-
|
|
32
|
-
const MCP_SERVER_ENTRY = {
|
|
33
|
-
command: 'npx',
|
|
34
|
-
args: ['@monoes/monograph', 'mcp'],
|
|
35
|
-
env: {},
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
const MCP_CONFIG_BLOCK = JSON.stringify(
|
|
39
|
-
{ mcpServers: { monograph: MCP_SERVER_ENTRY } },
|
|
40
|
-
null,
|
|
41
|
-
2,
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
// Sentinel used to detect whether the block is already present in markdown.
|
|
45
|
-
const MONOGRAPH_SENTINEL = '@monoes/monograph';
|
|
46
|
-
|
|
47
|
-
const MARKDOWN_BLOCK = `
|
|
48
|
-
## Monograph MCP Server
|
|
49
|
-
|
|
50
|
-
Add the following to your MCP configuration to enable monograph code intelligence:
|
|
51
|
-
|
|
52
|
-
\`\`\`json
|
|
53
|
-
${MCP_CONFIG_BLOCK}
|
|
54
|
-
\`\`\`
|
|
55
|
-
`;
|
|
56
|
-
|
|
57
|
-
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
58
|
-
|
|
59
|
-
async function readFileSafe(filePath: string): Promise<string> {
|
|
60
|
-
try {
|
|
61
|
-
return await fs.readFile(filePath, 'utf-8');
|
|
62
|
-
} catch {
|
|
63
|
-
return '';
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Append the monograph config block to a markdown file (CLAUDE.md / AGENTS.md).
|
|
69
|
-
* Idempotent: does nothing when the sentinel string is already present.
|
|
70
|
-
*/
|
|
71
|
-
async function upsertMarkdownFile(filePath: string): Promise<'configured' | 'skipped'> {
|
|
72
|
-
const existing = await readFileSafe(filePath);
|
|
73
|
-
|
|
74
|
-
if (existing.includes(MONOGRAPH_SENTINEL)) {
|
|
75
|
-
return 'skipped';
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const updated = existing.trimEnd() + '\n' + MARKDOWN_BLOCK.trimStart();
|
|
79
|
-
await fs.writeFile(filePath, updated, 'utf-8');
|
|
80
|
-
return 'configured';
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Merge the monograph server entry into a JSON MCP config file.
|
|
85
|
-
* Preserves existing keys. Idempotent.
|
|
86
|
-
*
|
|
87
|
-
* Handles corrupt / unreadable files gracefully (leaves them untouched).
|
|
88
|
-
*/
|
|
89
|
-
async function upsertJsonMcpFile(
|
|
90
|
-
filePath: string,
|
|
91
|
-
): Promise<'configured' | 'skipped' | 'error'> {
|
|
92
|
-
const raw = await readFileSafe(filePath);
|
|
93
|
-
|
|
94
|
-
let config: Record<string, unknown> = {};
|
|
95
|
-
|
|
96
|
-
if (raw.trim().length > 0) {
|
|
97
|
-
try {
|
|
98
|
-
config = JSON.parse(raw);
|
|
99
|
-
} catch {
|
|
100
|
-
// Corrupt JSON — leave untouched
|
|
101
|
-
return 'error';
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// Check idempotency
|
|
106
|
-
const servers = (config.mcpServers ?? {}) as Record<string, unknown>;
|
|
107
|
-
if (servers.monograph !== undefined) {
|
|
108
|
-
return 'skipped';
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
config.mcpServers = { ...servers, monograph: MCP_SERVER_ENTRY };
|
|
112
|
-
|
|
113
|
-
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
114
|
-
await fs.writeFile(filePath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
115
|
-
return 'configured';
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// ─── Per-tool handlers ────────────────────────────────────────────────────────
|
|
119
|
-
|
|
120
|
-
async function setupClaude(repoPath: string, result: SetupResult): Promise<void> {
|
|
121
|
-
const filePath = path.join(repoPath, 'CLAUDE.md');
|
|
122
|
-
try {
|
|
123
|
-
const outcome = await upsertMarkdownFile(filePath);
|
|
124
|
-
if (outcome === 'configured') {
|
|
125
|
-
result.configured.push('CLAUDE.md');
|
|
126
|
-
} else {
|
|
127
|
-
result.skipped.push('CLAUDE.md');
|
|
128
|
-
}
|
|
129
|
-
} catch (err: unknown) {
|
|
130
|
-
result.errors.push(`CLAUDE.md: ${(err as Error).message}`);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
async function setupCursor(repoPath: string, result: SetupResult): Promise<void> {
|
|
135
|
-
const filePath = path.join(repoPath, '.cursor', 'mcp.json');
|
|
136
|
-
try {
|
|
137
|
-
const outcome = await upsertJsonMcpFile(filePath);
|
|
138
|
-
if (outcome === 'configured') {
|
|
139
|
-
result.configured.push('.cursor/mcp.json');
|
|
140
|
-
} else if (outcome === 'skipped') {
|
|
141
|
-
result.skipped.push('.cursor/mcp.json');
|
|
142
|
-
} else {
|
|
143
|
-
result.errors.push('.cursor/mcp.json: file is corrupt — skipping to preserve existing content');
|
|
144
|
-
}
|
|
145
|
-
} catch (err: unknown) {
|
|
146
|
-
result.errors.push(`.cursor/mcp.json: ${(err as Error).message}`);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
async function setupAgentsMd(repoPath: string, result: SetupResult): Promise<void> {
|
|
151
|
-
const filePath = path.join(repoPath, 'AGENTS.md');
|
|
152
|
-
try {
|
|
153
|
-
const outcome = await upsertMarkdownFile(filePath);
|
|
154
|
-
if (outcome === 'configured') {
|
|
155
|
-
result.configured.push('AGENTS.md');
|
|
156
|
-
} else {
|
|
157
|
-
result.skipped.push('AGENTS.md');
|
|
158
|
-
}
|
|
159
|
-
} catch (err: unknown) {
|
|
160
|
-
result.errors.push(`AGENTS.md: ${(err as Error).message}`);
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
165
|
-
|
|
166
|
-
const ALL_TOOLS: SetupTool[] = ['claude', 'cursor', 'agents-md'];
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Write the monograph MCP server configuration into AI tool config files.
|
|
170
|
-
*
|
|
171
|
-
* @param repoPath - Absolute path to the target repository root
|
|
172
|
-
* @param tools - Which tools to configure (default: all)
|
|
173
|
-
* @returns - SetupResult describing what was written / skipped / errored
|
|
174
|
-
*
|
|
175
|
-
* @example
|
|
176
|
-
* const result = await setupMonograph({ repoPath: '/path/to/repo' });
|
|
177
|
-
* console.log(result.configured); // ['CLAUDE.md', '.cursor/mcp.json', 'AGENTS.md']
|
|
178
|
-
*/
|
|
179
|
-
export async function setupMonograph(options: SetupOptions): Promise<SetupResult> {
|
|
180
|
-
const { repoPath, tools = ALL_TOOLS } = options;
|
|
181
|
-
|
|
182
|
-
const result: SetupResult = {
|
|
183
|
-
configured: [],
|
|
184
|
-
skipped: [],
|
|
185
|
-
errors: [],
|
|
186
|
-
};
|
|
187
|
-
|
|
188
|
-
const handlers: Record<SetupTool, (repoPath: string, result: SetupResult) => Promise<void>> = {
|
|
189
|
-
claude: setupClaude,
|
|
190
|
-
cursor: setupCursor,
|
|
191
|
-
'agents-md': setupAgentsMd,
|
|
192
|
-
};
|
|
193
|
-
|
|
194
|
-
await Promise.all(tools.map((tool) => handlers[tool](repoPath, result)));
|
|
195
|
-
|
|
196
|
-
return result;
|
|
197
|
-
}
|