@monoes/monograph 1.5.6 → 1.5.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -15
- package/dist/src/analysis/changed-files.d.ts +3 -0
- package/dist/src/analysis/changed-files.d.ts.map +1 -1
- package/dist/src/analysis/changed-files.js +11 -9
- package/dist/src/analysis/changed-files.js.map +1 -1
- package/dist/src/analysis/changed-workspaces.d.ts.map +1 -1
- package/dist/src/analysis/changed-workspaces.js +2 -9
- package/dist/src/analysis/changed-workspaces.js.map +1 -1
- package/dist/src/analysis/git-changed-files.d.ts +3 -0
- package/dist/src/analysis/git-changed-files.d.ts.map +1 -1
- package/dist/src/analysis/git-changed-files.js +17 -12
- package/dist/src/analysis/git-changed-files.js.map +1 -1
- package/dist/src/analysis/git-ref.d.ts +33 -0
- package/dist/src/analysis/git-ref.d.ts.map +1 -0
- package/dist/src/analysis/git-ref.js +54 -0
- package/dist/src/analysis/git-ref.js.map +1 -0
- package/dist/src/analyze/boundary-analysis.d.ts.map +1 -1
- package/dist/src/analyze/boundary-analysis.js +42 -42
- package/dist/src/analyze/boundary-analysis.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/lsp/server.d.ts +1 -1
- package/dist/src/lsp/server.d.ts.map +1 -1
- package/dist/src/lsp/server.js +48 -13
- package/dist/src/lsp/server.js.map +1 -1
- package/dist/src/mcp-tools/api-impact.d.ts.map +1 -1
- package/dist/src/mcp-tools/api-impact.js +1 -16
- package/dist/src/mcp-tools/api-impact.js.map +1 -1
- package/dist/src/mcp-tools/context.d.ts.map +1 -1
- package/dist/src/mcp-tools/context.js +12 -23
- package/dist/src/mcp-tools/context.js.map +1 -1
- package/dist/src/mcp-tools/explain.d.ts.map +1 -1
- package/dist/src/mcp-tools/explain.js +15 -20
- package/dist/src/mcp-tools/explain.js.map +1 -1
- package/dist/src/mcp-tools/graph-query.d.ts.map +1 -1
- package/dist/src/mcp-tools/graph-query.js +10 -19
- package/dist/src/mcp-tools/graph-query.js.map +1 -1
- package/dist/src/mcp-tools/impact.d.ts.map +1 -1
- package/dist/src/mcp-tools/impact.js +38 -41
- package/dist/src/mcp-tools/impact.js.map +1 -1
- package/dist/src/mcp-tools/neighbors.d.ts.map +1 -1
- package/dist/src/mcp-tools/neighbors.js +4 -22
- package/dist/src/mcp-tools/neighbors.js.map +1 -1
- package/dist/src/mcp-tools/query.d.ts.map +1 -1
- package/dist/src/mcp-tools/query.js +14 -9
- package/dist/src/mcp-tools/query.js.map +1 -1
- package/dist/src/mcp-tools/rename.d.ts.map +1 -1
- package/dist/src/mcp-tools/rename.js +3 -20
- package/dist/src/mcp-tools/rename.js.map +1 -1
- package/dist/src/parsers/c.d.ts.map +1 -1
- package/dist/src/parsers/c.js +12 -0
- package/dist/src/parsers/c.js.map +1 -1
- package/dist/src/parsers/extractor.d.ts.map +1 -1
- package/dist/src/parsers/extractor.js +2 -1
- package/dist/src/parsers/extractor.js.map +1 -1
- package/dist/src/parsers/go.d.ts.map +1 -1
- package/dist/src/parsers/go.js +19 -1
- package/dist/src/parsers/go.js.map +1 -1
- package/dist/src/parsers/language-config.d.ts +4 -0
- package/dist/src/parsers/language-config.d.ts.map +1 -1
- package/dist/src/parsers/language-parsers.d.ts.map +1 -1
- package/dist/src/parsers/language-parsers.js +3 -1
- package/dist/src/parsers/language-parsers.js.map +1 -1
- package/dist/src/parsers/loader.d.ts +1 -0
- package/dist/src/parsers/loader.d.ts.map +1 -1
- package/dist/src/parsers/loader.js +161 -20
- package/dist/src/parsers/loader.js.map +1 -1
- package/dist/src/parsers/python.d.ts.map +1 -1
- package/dist/src/parsers/python.js +6 -0
- package/dist/src/parsers/python.js.map +1 -1
- package/dist/src/parsers/rust.d.ts.map +1 -1
- package/dist/src/parsers/rust.js +10 -0
- package/dist/src/parsers/rust.js.map +1 -1
- package/dist/src/pipeline/orchestrator.d.ts.map +1 -1
- package/dist/src/pipeline/orchestrator.js +17 -0
- package/dist/src/pipeline/orchestrator.js.map +1 -1
- package/dist/src/pipeline/phases/pdf-parse.d.ts.map +1 -1
- package/dist/src/pipeline/phases/pdf-parse.js +10 -11
- package/dist/src/pipeline/phases/pdf-parse.js.map +1 -1
- package/dist/src/storage/edge-store.d.ts +1 -0
- package/dist/src/storage/edge-store.d.ts.map +1 -1
- package/dist/src/storage/edge-store.js +5 -8
- package/dist/src/storage/edge-store.js.map +1 -1
- package/dist/src/storage/node-store.d.ts +1 -0
- package/dist/src/storage/node-store.d.ts.map +1 -1
- package/dist/src/storage/node-store.js +11 -12
- package/dist/src/storage/node-store.js.map +1 -1
- package/dist/src/storage/schema.d.ts.map +1 -1
- package/dist/src/storage/schema.js +6 -0
- package/dist/src/storage/schema.js.map +1 -1
- package/dist/src/storage/utils.d.ts +11 -0
- package/dist/src/storage/utils.d.ts.map +1 -0
- package/dist/src/storage/utils.js +24 -0
- package/dist/src/storage/utils.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +12 -9
- package/.monomind/data/ranked-context.json +0 -5
- package/.monomind/loops/mastermind-review-1782162423447.json +0 -16
- package/.monomind/sessions/session-1777578175215.json +0 -15
- package/.monomind/sessions/session-1777823684507.json +0 -15
- package/.monomind/sessions/session-1777928944749.json +0 -15
- package/.monomind/sessions/session-1778052902210.json +0 -15
- package/.monomind/sessions/session-1778056744636.json +0 -15
- package/.monomind/sessions/session-1778061077599.json +0 -15
- package/.monomind/sessions/session-1778102154764.json +0 -15
- package/__tests__/analysis/shape-extractor.test.ts +0 -124
- package/__tests__/analysis/surprise-scorer.test.ts +0 -154
- package/__tests__/cache/extraction-cache.test.ts +0 -45
- package/__tests__/cli/ai-context.test.ts +0 -175
- package/__tests__/cli/augment.test.ts +0 -128
- package/__tests__/cli/doctor.test.ts +0 -125
- package/__tests__/cli/eval-server.test.ts +0 -89
- package/__tests__/cli/setup.test.ts +0 -178
- package/__tests__/cli/skill-gen.test.ts +0 -280
- package/__tests__/export/formats.test.ts +0 -82
- package/__tests__/fixtures/sample.c +0 -25
- package/__tests__/fixtures/sample.cpp +0 -32
- package/__tests__/fixtures/sample.dart +0 -34
- package/__tests__/fixtures/sample.kt +0 -30
- package/__tests__/fixtures/sample.php +0 -30
- package/__tests__/fixtures/sample.py +0 -11
- package/__tests__/fixtures/sample.rb +0 -26
- package/__tests__/fixtures/sample.swift +0 -42
- package/__tests__/fixtures/sample.ts +0 -17
- package/__tests__/fixtures/sample.vue +0 -40
- package/__tests__/groups/group-search.test.ts +0 -221
- package/__tests__/groups/group-sync.test.ts +0 -336
- package/__tests__/integration/build-atomicity.test.ts +0 -61
- package/__tests__/integration/call-attribution.test.ts +0 -116
- package/__tests__/integration/full-pipeline.test.ts +0 -64
- package/__tests__/integration/graph-report-freshness.test.ts +0 -53
- package/__tests__/integration/incremental-build.test.ts +0 -103
- package/__tests__/mcp-resources/resources.test.ts +0 -256
- package/__tests__/mcp-tools/api-impact.test.ts +0 -188
- package/__tests__/mcp-tools/context.test.ts +0 -130
- package/__tests__/mcp-tools/cypher.test.ts +0 -258
- package/__tests__/mcp-tools/detect-changes.test.ts +0 -114
- package/__tests__/mcp-tools/impact.test.ts +0 -133
- package/__tests__/mcp-tools/rename.test.ts +0 -117
- package/__tests__/mcp-tools/route-map.test.ts +0 -237
- package/__tests__/mcp-tools/shape-check.test.ts +0 -202
- package/__tests__/mcp-tools/tool-map.test.ts +0 -135
- package/__tests__/parsers/c.test.ts +0 -28
- package/__tests__/parsers/cpp.test.ts +0 -28
- package/__tests__/parsers/csharp.test.ts +0 -62
- package/__tests__/parsers/dart.test.ts +0 -28
- package/__tests__/parsers/kotlin.test.ts +0 -28
- package/__tests__/parsers/loader.test.ts +0 -14
- package/__tests__/parsers/php.test.ts +0 -28
- package/__tests__/parsers/python.test.ts +0 -32
- package/__tests__/parsers/ruby.test.ts +0 -33
- package/__tests__/parsers/swift.test.ts +0 -28
- package/__tests__/parsers/typescript.test.ts +0 -45
- package/__tests__/parsers/vue.test.ts +0 -28
- package/__tests__/pipeline/analysis.test.ts +0 -58
- package/__tests__/pipeline/phases/corpus-check.test.ts +0 -26
- package/__tests__/pipeline/phases/evidence.test.ts +0 -41
- package/__tests__/pipeline/phases/field-access.test.ts +0 -22
- package/__tests__/pipeline/phases/leiden.test.ts +0 -72
- package/__tests__/pipeline/phases/markdown.test.ts +0 -84
- package/__tests__/pipeline/phases/middleware-extractor.test.ts +0 -131
- package/__tests__/pipeline/phases/orm.test.ts +0 -379
- package/__tests__/pipeline/phases/processes.test.ts +0 -191
- package/__tests__/pipeline/phases/routes.test.ts +0 -195
- package/__tests__/pipeline/phases/scope-resolution.test.ts +0 -133
- package/__tests__/pipeline/phases/tools.test.ts +0 -161
- package/__tests__/pipeline/phases/variables.test.ts +0 -30
- package/__tests__/pipeline/phases/wildcard-synthesis.test.ts +0 -207
- package/__tests__/pipeline/phases.test.ts +0 -41
- package/__tests__/pipeline/runner.test.ts +0 -28
- package/__tests__/registry/repo-registry.test.ts +0 -127
- package/__tests__/reporting/graph-report.suggest.test.ts +0 -36
- package/__tests__/reporting/graph-report.test.ts +0 -165
- package/__tests__/search/ast-chunker.test.ts +0 -63
- package/__tests__/search/rrf.test.ts +0 -95
- package/__tests__/security/safe-fetch.test.ts +0 -41
- package/__tests__/security/sensitive-files.test.ts +0 -32
- package/__tests__/setup.ts +0 -1
- package/__tests__/skills/platform-skills.test.ts +0 -63
- package/__tests__/staleness/git-staleness.test.ts +0 -107
- package/__tests__/storage/db.test.ts +0 -37
- package/__tests__/storage/evidence-roundtrip.test.ts +0 -89
- package/__tests__/storage/stores.test.ts +0 -165
- package/__tests__/types.test.ts +0 -13
- package/__tests__/validation/extraction-validator.test.ts +0 -48
- package/__tests__/watch/watcher.test.ts +0 -31
- package/__tests__/web/analyze-api.test.ts +0 -66
- package/__tests__/web/api.test.ts +0 -210
- package/__tests__/web/mcp-http.test.ts +0 -67
- package/__tests__/web/react-ui.test.ts +0 -43
- package/__tests__/wiki/gist-publisher.test.ts +0 -66
- package/__tests__/wiki/providers.test.ts +0 -69
- package/__tests__/wiki/wiki-generator.test.ts +0 -260
- package/dist/src/fix/deps.d.ts +0 -14
- package/dist/src/fix/deps.d.ts.map +0 -1
- package/dist/src/fix/deps.js +0 -47
- package/dist/src/fix/deps.js.map +0 -1
- package/dist/src/fix/enum-members.d.ts +0 -20
- package/dist/src/fix/enum-members.d.ts.map +0 -1
- package/dist/src/fix/enum-members.js +0 -95
- package/dist/src/fix/enum-members.js.map +0 -1
- package/dist/src/fix/export-surgery.d.ts +0 -14
- package/dist/src/fix/export-surgery.d.ts.map +0 -1
- package/dist/src/fix/export-surgery.js +0 -140
- package/dist/src/fix/export-surgery.js.map +0 -1
- package/dist/src/fix/exports.d.ts +0 -16
- package/dist/src/fix/exports.d.ts.map +0 -1
- package/dist/src/fix/exports.js +0 -65
- package/dist/src/fix/exports.js.map +0 -1
- package/dist/src/fix/orchestrator.d.ts +0 -28
- package/dist/src/fix/orchestrator.d.ts.map +0 -1
- package/dist/src/fix/orchestrator.js +0 -39
- package/dist/src/fix/orchestrator.js.map +0 -1
- package/src/__tests__/analysis/benchmark.test.ts +0 -59
- package/src/__tests__/analysis/cluster-quality.test.ts +0 -106
- package/src/__tests__/analysis/corpus-health.test.ts +0 -33
- package/src/__tests__/analysis/dependency-health.test.ts +0 -105
- package/src/__tests__/analysis/file-classifier.test.ts +0 -50
- package/src/__tests__/analysis/node-similarity.test.ts +0 -81
- package/src/__tests__/cache/augment-cache.test.ts +0 -55
- package/src/__tests__/cli/check-update.test.ts +0 -42
- package/src/__tests__/cli/hooks-install.test.ts +0 -56
- package/src/__tests__/cli/hooks-marker.test.ts +0 -138
- package/src/__tests__/cli/hooks-status.test.ts +0 -42
- package/src/__tests__/export/adjacency-matrix.test.ts +0 -116
- package/src/__tests__/export/csv.test.ts +0 -39
- package/src/__tests__/export/dot.test.ts +0 -86
- package/src/__tests__/export/gexf.test.ts +0 -78
- package/src/__tests__/export/graphml.test.ts +0 -57
- package/src/__tests__/export/mermaid.test.ts +0 -89
- package/src/__tests__/graph/betweenness.test.ts +0 -89
- package/src/__tests__/graph/cycles.test.ts +0 -131
- package/src/__tests__/graph/dead-code.test.ts +0 -174
- package/src/__tests__/graph/dfs.test.ts +0 -62
- package/src/__tests__/graph/diff-summary.test.ts +0 -83
- package/src/__tests__/graph/edge-filter.test.ts +0 -129
- package/src/__tests__/graph/import-chain.test.ts +0 -111
- package/src/__tests__/graph/merge.test.ts +0 -151
- package/src/__tests__/graph/node-search.test.ts +0 -167
- package/src/__tests__/graph/normalize-id.test.ts +0 -102
- package/src/__tests__/graph/pagerank.test.ts +0 -96
- package/src/__tests__/graph/prune.test.ts +0 -110
- package/src/__tests__/graph/regex-search.test.ts +0 -166
- package/src/__tests__/graph/ripple-impact.test.ts +0 -73
- package/src/__tests__/graph/scc.test.ts +0 -85
- package/src/__tests__/graph/statistics.test.ts +0 -219
- package/src/__tests__/graph/subgraph.test.ts +0 -127
- package/src/__tests__/graph/topo-sort.test.ts +0 -110
- package/src/__tests__/graph/wcc.test.ts +0 -101
- package/src/__tests__/groups/grpc-extractor.test.ts +0 -47
- package/src/__tests__/groups/service-boundary.test.ts +0 -86
- package/src/__tests__/groups/topic-extractor.test.ts +0 -43
- package/src/__tests__/ingest/git-clone.test.ts +0 -128
- package/src/__tests__/ingest/query-memory.test.ts +0 -123
- package/src/__tests__/ingest/transcribe.test.ts +0 -58
- package/src/__tests__/ingest/url-ingest.test.ts +0 -48
- package/src/__tests__/mcp-resources/repo-context-resource.test.ts +0 -37
- package/src/__tests__/mcp-resources/repos-resource.test.ts +0 -71
- package/src/__tests__/mcp-resources/wiki-resource.test.ts +0 -52
- package/src/__tests__/mcp-tools/explain.test.ts +0 -46
- package/src/__tests__/mcp-tools/graph-query.test.ts +0 -45
- package/src/__tests__/mcp-tools/group-sync.test.ts +0 -8
- package/src/__tests__/mcp-tools/impact-filtering.test.ts +0 -48
- package/src/__tests__/mcp-tools/impact.risk.test.ts +0 -24
- package/src/__tests__/mcp-tools/list-repos.test.ts +0 -24
- package/src/__tests__/mcp-tools/neighbors.test.ts +0 -48
- package/src/__tests__/mcp-tools/query.test.ts +0 -42
- package/src/__tests__/parsers/language-parsers.test.ts +0 -52
- package/src/__tests__/parsers/named-bindings.test.ts +0 -73
- package/src/__tests__/pipeline/cluster-only.test.ts +0 -33
- package/src/__tests__/pipeline/phases/bridge-adapters/electron-ipc.test.ts +0 -87
- package/src/__tests__/pipeline/phases/bridge-adapters/tauri.test.ts +0 -116
- package/src/__tests__/pipeline/phases/bridge-adapters/wails.test.ts +0 -81
- package/src/__tests__/pipeline/phases/bridge-resolver.test.ts +0 -110
- package/src/__tests__/pipeline/phases/communities.cohesion.test.ts +0 -43
- package/src/__tests__/pipeline/phases/community-split.test.ts +0 -30
- package/src/__tests__/pipeline/phases/framework-detect.test.ts +0 -65
- package/src/__tests__/pipeline/phases/import-resolver.test.ts +0 -64
- package/src/__tests__/pipeline/phases/parse-arrow.test.ts +0 -33
- package/src/__tests__/pipeline/phases/parse-csharp.test.ts +0 -33
- package/src/__tests__/pipeline/phases/scan.monographignore.test.ts +0 -53
- package/src/__tests__/pipeline/phases/scan.negation.test.ts +0 -40
- package/src/__tests__/pipeline/phases/scope-resolution.go.test.ts +0 -34
- package/src/__tests__/pipeline/phases/scope-resolution.java.test.ts +0 -30
- package/src/__tests__/pipeline/phases/scope-resolution.rust.test.ts +0 -31
- package/src/__tests__/pipeline/phases/suggest-questions.test.ts +0 -46
- package/src/__tests__/pipeline/phases/surprises-scoring.test.ts +0 -46
- package/src/__tests__/pipeline/phases/variables-phase.test.ts +0 -78
- package/src/__tests__/pipeline/phases/wildcard-phase.test.ts +0 -99
- package/src/__tests__/pipeline/runner.parallel.test.ts +0 -78
- package/src/__tests__/reporting/graph-report-confidence.test.ts +0 -43
- package/src/__tests__/reporting/graph-report-gaps.test.ts +0 -41
- package/src/__tests__/scope-resolution/call-sites.test.ts +0 -89
- package/src/__tests__/scope-resolution/evidence-weights.test.ts +0 -49
- package/src/__tests__/search/diacritic.test.ts +0 -23
- package/src/__tests__/security/safe-fetch.test.ts +0 -125
- package/src/__tests__/skills/platform-skills.extra.test.ts +0 -36
- package/src/__tests__/web/api.clusters.test.ts +0 -65
- package/src/__tests__/web/api.file.test.ts +0 -44
- package/src/__tests__/web/api.grep.test.ts +0 -47
- package/src/__tests__/web/api.info.test.ts +0 -18
- package/src/__tests__/web/api.jobs.test.ts +0 -47
- package/src/__tests__/web/api.progress.test.ts +0 -25
- package/src/__tests__/web/api.stream.test.ts +0 -35
- package/src/__tests__/wiki/providers-reasoning.test.ts +0 -46
- package/src/__tests__/wiki/wiki-review-mode.test.ts +0 -22
- package/src/analysis/benchmark.ts +0 -132
- package/src/analysis/changed-files.ts +0 -73
- package/src/analysis/changed-workspaces.ts +0 -94
- package/src/analysis/churn-cache.ts +0 -179
- package/src/analysis/churn-trend.ts +0 -57
- package/src/analysis/churn.ts +0 -263
- package/src/analysis/cluster-quality.ts +0 -142
- package/src/analysis/combined.ts +0 -41
- package/src/analysis/corpus-health.ts +0 -41
- package/src/analysis/coverage-gaps.ts +0 -246
- package/src/analysis/dep-classification.ts +0 -167
- package/src/analysis/dependency-health.ts +0 -146
- package/src/analysis/duplicate-exports.ts +0 -110
- package/src/analysis/fallow-suppression.ts +0 -98
- package/src/analysis/feature-flags-config.ts +0 -47
- package/src/analysis/feature-flags.ts +0 -223
- package/src/analysis/file-classifier.ts +0 -87
- package/src/analysis/git-changed-files.ts +0 -62
- package/src/analysis/health-baseline.ts +0 -80
- package/src/analysis/issue-filters.ts +0 -56
- package/src/analysis/list.ts +0 -74
- package/src/analysis/node-similarity.ts +0 -115
- package/src/analysis/private-type-leaks.ts +0 -119
- package/src/analysis/progress.ts +0 -43
- package/src/analysis/project-state.ts +0 -95
- package/src/analysis/regression-config.ts +0 -36
- package/src/analysis/rule-overrides.ts +0 -81
- package/src/analysis/scripts.ts +0 -95
- package/src/analysis/shape-extractor.ts +0 -202
- package/src/analysis/since-duration.ts +0 -42
- package/src/analysis/suppression-context.ts +0 -95
- package/src/analysis/suppressions.ts +0 -80
- package/src/analysis/surprise-scorer.ts +0 -74
- package/src/analysis/targets.ts +0 -237
- package/src/analysis/unused-class-members.ts +0 -79
- package/src/analysis/workspace-filter.ts +0 -89
- package/src/analyze/boundary-analysis.ts +0 -129
- package/src/analyze/predicates/file.ts +0 -86
- package/src/analyze/predicates/import.ts +0 -90
- package/src/analyze/predicates/lifecycle.ts +0 -55
- package/src/analyze/unused-deps.ts +0 -70
- package/src/analyze/unused-exports.ts +0 -145
- package/src/analyze/unused-files.ts +0 -46
- package/src/api/production-override.ts +0 -63
- package/src/api/programmatic.ts +0 -118
- package/src/audit.ts +0 -234
- package/src/cache/augment-cache.ts +0 -63
- package/src/cache/extraction-cache.ts +0 -141
- package/src/check/filtering.ts +0 -78
- package/src/check/index.ts +0 -99
- package/src/check/output.ts +0 -79
- package/src/check/rules.ts +0 -61
- package/src/ci-template.ts +0 -84
- package/src/claude-cli.ts +0 -59
- package/src/cli/ai-context.ts +0 -193
- package/src/cli/augment.ts +0 -114
- package/src/cli/check-update.ts +0 -40
- package/src/cli/doctor.ts +0 -182
- package/src/cli/eval-server.ts +0 -126
- package/src/cli/hooks-install.ts +0 -202
- package/src/cli/setup.ts +0 -197
- package/src/cli/skill-gen.ts +0 -347
- package/src/commands/flags.ts +0 -72
- package/src/config/boundary-config.ts +0 -183
- package/src/config/cli-schema.ts +0 -81
- package/src/config/config-parsing.ts +0 -102
- package/src/config/duplicates-config.ts +0 -62
- package/src/config/external-plugin.ts +0 -77
- package/src/config/health-config.ts +0 -42
- package/src/config/ignore-exports-used-in-file.ts +0 -46
- package/src/config/migration-types.ts +0 -73
- package/src/config/output-format.ts +0 -24
- package/src/config/plugins/builtin.ts +0 -411
- package/src/config/plugins/registry.ts +0 -77
- package/src/config/plugins/types.ts +0 -14
- package/src/config/resolution.ts +0 -102
- package/src/config/rules.ts +0 -70
- package/src/config/schema-gen.ts +0 -115
- package/src/config/types.ts +0 -149
- package/src/config/used-class-members.ts +0 -53
- package/src/config/validate.ts +0 -108
- package/src/config/workspace.ts +0 -137
- package/src/coverage/cloud-client.ts +0 -111
- package/src/coverage/upload-inventory.ts +0 -84
- package/src/coverage/upload-source-maps.ts +0 -97
- package/src/discover/entry-points.ts +0 -51
- package/src/discover/infrastructure-entries.ts +0 -175
- package/src/duplicates/detect/concatenation.ts +0 -37
- package/src/duplicates/detect/extraction.ts +0 -107
- package/src/duplicates/detect/filtering.ts +0 -112
- package/src/duplicates/detect/lcp.ts +0 -27
- package/src/duplicates/detect/ranking.ts +0 -16
- package/src/duplicates/detect/statistics.ts +0 -69
- package/src/duplicates/detect/suffix-array.ts +0 -88
- package/src/duplicates/families.ts +0 -95
- package/src/duplicates/normalize.ts +0 -58
- package/src/duplicates/shingle-filter.ts +0 -37
- package/src/duplicates/token-types.ts +0 -62
- package/src/duplicates/tokenize/index.ts +0 -104
- package/src/error/fallow-error.ts +0 -94
- package/src/error.ts +0 -47
- package/src/export/adjacency-matrix.ts +0 -127
- package/src/export/analysis-json.ts +0 -87
- package/src/export/badge.ts +0 -105
- package/src/export/canvas.ts +0 -42
- package/src/export/codeclimate.ts +0 -201
- package/src/export/compact-health.ts +0 -119
- package/src/export/compact.ts +0 -83
- package/src/export/csv.ts +0 -33
- package/src/export/cypher.ts +0 -33
- package/src/export/dot.ts +0 -52
- package/src/export/gexf.ts +0 -59
- package/src/export/graphml.ts +0 -50
- package/src/export/html.ts +0 -548
- package/src/export/index.ts +0 -9
- package/src/export/json.ts +0 -36
- package/src/export/markdown.ts +0 -290
- package/src/export/mermaid.ts +0 -100
- package/src/export/obsidian.ts +0 -44
- package/src/export/sarif.ts +0 -245
- package/src/export/svg.ts +0 -68
- package/src/fix/deps.ts +0 -70
- package/src/fix/enum-members.ts +0 -103
- package/src/fix/export-surgery.ts +0 -197
- package/src/fix/exports.ts +0 -93
- package/src/fix/orchestrator.ts +0 -67
- package/src/graph/analyzer.ts +0 -69
- package/src/graph/author-analytics.ts +0 -217
- package/src/graph/baseline.ts +0 -432
- package/src/graph/clone-families.ts +0 -132
- package/src/graph/codeowners-extended.ts +0 -114
- package/src/graph/codeowners-gitlab.ts +0 -150
- package/src/graph/codeowners.ts +0 -217
- package/src/graph/complexity.ts +0 -200
- package/src/graph/cross-reference-findings.ts +0 -85
- package/src/graph/cross-reference.ts +0 -139
- package/src/graph/cycle-detection.ts +0 -311
- package/src/graph/cycles.ts +0 -222
- package/src/graph/dead-code.ts +0 -128
- package/src/graph/dependency-closure.ts +0 -126
- package/src/graph/dfs.ts +0 -118
- package/src/graph/diff.ts +0 -92
- package/src/graph/duplication-stats.ts +0 -79
- package/src/graph/edge-filter.ts +0 -117
- package/src/graph/explain.ts +0 -133
- package/src/graph/external-style-usage.ts +0 -81
- package/src/graph/health-score.ts +0 -179
- package/src/graph/hotspots.ts +0 -219
- package/src/graph/import-chain.ts +0 -148
- package/src/graph/loader.ts +0 -44
- package/src/graph/maintainability.ts +0 -156
- package/src/graph/merge.ts +0 -174
- package/src/graph/mirrored-dirs.ts +0 -202
- package/src/graph/narrowing.ts +0 -92
- package/src/graph/node-search.ts +0 -201
- package/src/graph/node-types.ts +0 -67
- package/src/graph/normalize-id.ts +0 -138
- package/src/graph/pagerank.ts +0 -165
- package/src/graph/prune.ts +0 -95
- package/src/graph/re-exports/propagate.ts +0 -95
- package/src/graph/reachability.ts +0 -99
- package/src/graph/regex-search.ts +0 -232
- package/src/graph/regression.ts +0 -199
- package/src/graph/resolve/discover-types.ts +0 -45
- package/src/graph/resolve/dynamic-imports.ts +0 -102
- package/src/graph/resolve/fallbacks.ts +0 -79
- package/src/graph/resolve/index.ts +0 -68
- package/src/graph/resolve/path-info.ts +0 -41
- package/src/graph/resolve/re-exports.ts +0 -14
- package/src/graph/resolve/react-native.ts +0 -27
- package/src/graph/resolve/require-imports.ts +0 -18
- package/src/graph/resolve/specifier.ts +0 -120
- package/src/graph/resolve/static-imports.ts +0 -14
- package/src/graph/resolve/types.ts +0 -108
- package/src/graph/resolve/upgrades.ts +0 -32
- package/src/graph/ripple-impact.ts +0 -131
- package/src/graph/risk-profile.ts +0 -179
- package/src/graph/statistics.ts +0 -165
- package/src/graph/stats.ts +0 -157
- package/src/graph/subgraph.ts +0 -162
- package/src/graph/topo-sort.ts +0 -171
- package/src/graph/wcc.ts +0 -187
- package/src/groups/contract-bridge.ts +0 -103
- package/src/groups/contract-registry.ts +0 -263
- package/src/groups/group-config.ts +0 -108
- package/src/groups/group-search.ts +0 -139
- package/src/groups/group-sync.ts +0 -82
- package/src/groups/grpc-extractor.ts +0 -64
- package/src/groups/service-boundary.ts +0 -119
- package/src/groups/topic-extractor.ts +0 -90
- package/src/health/analysis-counts-snapshot.ts +0 -57
- package/src/health/analysis-counts.ts +0 -70
- package/src/health/complexity-findings.ts +0 -115
- package/src/health/distribution-thresholds.ts +0 -54
- package/src/health/grouping.ts +0 -138
- package/src/health/health-grouping.ts +0 -86
- package/src/health/health-report-types.ts +0 -165
- package/src/health/health-report.ts +0 -81
- package/src/health/health-score.ts +0 -65
- package/src/health/hotspot-utils.ts +0 -55
- package/src/health/hotspots.ts +0 -104
- package/src/health/large-functions.ts +0 -34
- package/src/health/ownership-metrics.ts +0 -61
- package/src/health/ownership-risk.ts +0 -98
- package/src/health/ownership.ts +0 -174
- package/src/health/quality-gate.ts +0 -57
- package/src/health/risk-profile.ts +0 -39
- package/src/health/runtime-coverage-report.ts +0 -101
- package/src/health/runtime-coverage.ts +0 -71
- package/src/health/scores.ts +0 -72
- package/src/health/scoring-types.ts +0 -48
- package/src/health/target-thresholds.ts +0 -92
- package/src/health/target-types.ts +0 -54
- package/src/health/targets.ts +0 -151
- package/src/health/timings.ts +0 -86
- package/src/health/trend-types.ts +0 -57
- package/src/health/trends.ts +0 -86
- package/src/health/vital-signs-compute.ts +0 -108
- package/src/health/vital-signs-snapshot.ts +0 -72
- package/src/health/vital-signs.ts +0 -101
- package/src/index.ts +0 -111
- package/src/ingest/git-clone.ts +0 -246
- package/src/ingest/query-memory.ts +0 -132
- package/src/ingest/transcribe.ts +0 -254
- package/src/ingest/url-ingest.ts +0 -87
- package/src/init/agent-hooks.ts +0 -86
- package/src/init/git-hooks.ts +0 -71
- package/src/init/project-detection.ts +0 -105
- package/src/license/manager.ts +0 -120
- package/src/lsp/code-actions.ts +0 -127
- package/src/lsp/code-lens.ts +0 -56
- package/src/lsp/diagnostics-ext.ts +0 -150
- package/src/lsp/diagnostics-push.ts +0 -103
- package/src/lsp/diagnostics.ts +0 -98
- package/src/lsp/hover.ts +0 -64
- package/src/lsp/server.ts +0 -254
- package/src/mcp/params.ts +0 -201
- package/src/mcp/resources.ts +0 -124
- package/src/mcp/tool-builders.ts +0 -203
- package/src/mcp-resources/communities-resource.ts +0 -72
- package/src/mcp-resources/graph-resource.ts +0 -14
- package/src/mcp-resources/index.ts +0 -9
- package/src/mcp-resources/named-cluster-resource.ts +0 -35
- package/src/mcp-resources/named-process-resource.ts +0 -26
- package/src/mcp-resources/processes-resource.ts +0 -67
- package/src/mcp-resources/repo-context-resource.ts +0 -36
- package/src/mcp-resources/repos-resource.ts +0 -21
- package/src/mcp-resources/schema-resource.ts +0 -46
- package/src/mcp-resources/wiki-resource.ts +0 -23
- package/src/mcp-tools/api-impact.ts +0 -181
- package/src/mcp-tools/context.ts +0 -111
- package/src/mcp-tools/cypher.ts +0 -29
- package/src/mcp-tools/detect-changes.ts +0 -116
- package/src/mcp-tools/explain.ts +0 -65
- package/src/mcp-tools/graph-query.ts +0 -128
- package/src/mcp-tools/group-list.ts +0 -88
- package/src/mcp-tools/group-query.ts +0 -26
- package/src/mcp-tools/group-sync.ts +0 -32
- package/src/mcp-tools/impact.ts +0 -202
- package/src/mcp-tools/index.ts +0 -21
- package/src/mcp-tools/list-repos.ts +0 -38
- package/src/mcp-tools/neighbors.ts +0 -80
- package/src/mcp-tools/query.ts +0 -86
- package/src/mcp-tools/rename.ts +0 -118
- package/src/mcp-tools/route-map.ts +0 -98
- package/src/mcp-tools/serve.ts +0 -41
- package/src/mcp-tools/shape-check.ts +0 -182
- package/src/mcp-tools/staleness.ts +0 -13
- package/src/mcp-tools/tool-map.ts +0 -66
- package/src/mcp-tools/wiki-build.ts +0 -37
- package/src/mcp-tools/wiki.ts +0 -28
- package/src/migrate/jscpd.ts +0 -78
- package/src/migrate/jsonc-gen.ts +0 -38
- package/src/migrate/knip.ts +0 -126
- package/src/migrate/toml-gen.ts +0 -48
- package/src/parsers/c.ts +0 -31
- package/src/parsers/cpp.ts +0 -29
- package/src/parsers/csharp.ts +0 -43
- package/src/parsers/dart.ts +0 -39
- package/src/parsers/extractor.ts +0 -202
- package/src/parsers/go.ts +0 -27
- package/src/parsers/java.ts +0 -27
- package/src/parsers/kotlin.ts +0 -36
- package/src/parsers/language-config.ts +0 -28
- package/src/parsers/language-parsers.ts +0 -120
- package/src/parsers/loader.ts +0 -149
- package/src/parsers/named-bindings.ts +0 -63
- package/src/parsers/php.ts +0 -37
- package/src/parsers/python.ts +0 -26
- package/src/parsers/ruby.ts +0 -39
- package/src/parsers/rust.ts +0 -25
- package/src/parsers/swift.ts +0 -28
- package/src/parsers/typescript.ts +0 -41
- package/src/parsers/vue.ts +0 -79
- package/src/pipeline/cluster-only.ts +0 -64
- package/src/pipeline/effort.ts +0 -50
- package/src/pipeline/orchestrator.ts +0 -384
- package/src/pipeline/phases/boundary.ts +0 -151
- package/src/pipeline/phases/bridge-adapters/electron-ipc.ts +0 -91
- package/src/pipeline/phases/bridge-adapters/registry.ts +0 -14
- package/src/pipeline/phases/bridge-adapters/tauri.ts +0 -103
- package/src/pipeline/phases/bridge-adapters/types.ts +0 -31
- package/src/pipeline/phases/bridge-adapters/wails.ts +0 -33
- package/src/pipeline/phases/bridge-resolver.ts +0 -77
- package/src/pipeline/phases/call-site-extractors.ts +0 -177
- package/src/pipeline/phases/communities.ts +0 -183
- package/src/pipeline/phases/contextual-proximity.ts +0 -88
- package/src/pipeline/phases/cross-file.ts +0 -116
- package/src/pipeline/phases/docs-parse.ts +0 -307
- package/src/pipeline/phases/evidence.ts +0 -9
- package/src/pipeline/phases/field-access.ts +0 -49
- package/src/pipeline/phases/framework-detect.ts +0 -109
- package/src/pipeline/phases/god-nodes.ts +0 -163
- package/src/pipeline/phases/import-resolver.ts +0 -114
- package/src/pipeline/phases/leiden.ts +0 -77
- package/src/pipeline/phases/llm-extract.ts +0 -178
- package/src/pipeline/phases/markdown.ts +0 -121
- package/src/pipeline/phases/middleware-extractor.ts +0 -127
- package/src/pipeline/phases/module-resolution.ts +0 -294
- package/src/pipeline/phases/mro.ts +0 -56
- package/src/pipeline/phases/orm.ts +0 -503
- package/src/pipeline/phases/parse.ts +0 -222
- package/src/pipeline/phases/pdf-parse.ts +0 -133
- package/src/pipeline/phases/processes.ts +0 -249
- package/src/pipeline/phases/re-export-propagation.ts +0 -160
- package/src/pipeline/phases/reachability.ts +0 -156
- package/src/pipeline/phases/routes.ts +0 -350
- package/src/pipeline/phases/scan.ts +0 -133
- package/src/pipeline/phases/scope-resolution.ts +0 -442
- package/src/pipeline/phases/structure.ts +0 -68
- package/src/pipeline/phases/suggest.ts +0 -92
- package/src/pipeline/phases/surprises.ts +0 -83
- package/src/pipeline/phases/tools.ts +0 -180
- package/src/pipeline/phases/variables-phase.ts +0 -37
- package/src/pipeline/phases/variables.ts +0 -67
- package/src/pipeline/phases/wildcard-phase.ts +0 -50
- package/src/pipeline/phases/wildcard-synthesis.ts +0 -214
- package/src/pipeline/progress.ts +0 -58
- package/src/pipeline/runner.ts +0 -88
- package/src/pipeline/types.ts +0 -41
- package/src/query/cypher-parser.ts +0 -450
- package/src/registry/repo-registry.ts +0 -125
- package/src/regression/baseline-deltas.ts +0 -215
- package/src/regression/baseline.ts +0 -76
- package/src/regression/counts.ts +0 -87
- package/src/regression/outcome.ts +0 -78
- package/src/regression/tolerance.ts +0 -35
- package/src/report/attributed-duplication.ts +0 -112
- package/src/report/badge-svg.ts +0 -100
- package/src/report/cross-ref-human.ts +0 -50
- package/src/report/duplication-grouping.ts +0 -74
- package/src/report/grouping.ts +0 -137
- package/src/report/human-check.ts +0 -291
- package/src/report/human-dupes.ts +0 -142
- package/src/report/human-health.ts +0 -195
- package/src/report/human.ts +0 -120
- package/src/report/json-actions.ts +0 -91
- package/src/report/json-builders.ts +0 -70
- package/src/report/json-schema.ts +0 -75
- package/src/report/number-format.ts +0 -91
- package/src/report/output-grouped.ts +0 -102
- package/src/report/pipeline-perf.ts +0 -56
- package/src/report/trace-human.ts +0 -127
- package/src/reporting/graph-report.ts +0 -431
- package/src/results/fallow-results.ts +0 -152
- package/src/results/types.ts +0 -149
- package/src/scope-resolution/evidence-weights.ts +0 -41
- package/src/search/ast-chunker.ts +0 -206
- package/src/search/diacritic.ts +0 -7
- package/src/search/hybrid-query.ts +0 -65
- package/src/search/rrf.ts +0 -51
- package/src/security/safe-fetch.ts +0 -113
- package/src/security/sensitive-files.ts +0 -24
- package/src/skills/platform-skills.ts +0 -233
- package/src/staleness/git-staleness.ts +0 -66
- package/src/storage/db.ts +0 -110
- package/src/storage/edge-store.ts +0 -103
- package/src/storage/file-cache.ts +0 -78
- package/src/storage/fts-store.ts +0 -385
- package/src/storage/node-store.ts +0 -209
- package/src/storage/schema.ts +0 -171
- package/src/storage/suppressions.ts +0 -145
- package/src/storage/unlinked-refs.ts +0 -117
- package/src/types.ts +0 -197
- package/src/validation/extraction-validator.ts +0 -54
- package/src/watch/watcher.ts +0 -160
- package/src/web/analyze-api.ts +0 -146
- package/src/web/api.ts +0 -584
- package/src/web/async-jobs.ts +0 -109
- package/src/web/mcp-http.ts +0 -227
- package/src/web/react-ui.ts +0 -78
- package/src/web/server.ts +0 -90
- package/src/web/ui/index.html +0 -204
- package/src/wiki/gist-publisher.ts +0 -76
- package/src/wiki/prompt-builder.ts +0 -35
- package/src/wiki/providers.ts +0 -134
- package/src/wiki/wiki-generator.ts +0 -223
- package/src/wiki/wiki-store.ts +0 -49
- package/tsconfig.json +0 -11
- package/vitest.config.ts +0 -20
package/src/ingest/transcribe.ts
DELETED
|
@@ -1,254 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Video / audio transcription support.
|
|
3
|
-
*
|
|
4
|
-
* Mirrors graphify's `transcribe.py`: converts video/audio files or URLs to
|
|
5
|
-
* plain-text transcript files that the pipeline can then extract as document
|
|
6
|
-
* nodes.
|
|
7
|
-
*
|
|
8
|
-
* Implementation strategy
|
|
9
|
-
* -----------------------
|
|
10
|
-
* TypeScript cannot import Python's faster-whisper directly. Instead this
|
|
11
|
-
* module shells out to the faster-whisper CLI (`faster-whisper`) or the
|
|
12
|
-
* `whisper` CLI (OpenAI's original). yt-dlp is used for URL audio downloads.
|
|
13
|
-
* If neither tool is installed, functions throw descriptive errors.
|
|
14
|
-
*
|
|
15
|
-
* Environment variables
|
|
16
|
-
* ---------------------
|
|
17
|
-
* MONOGRAPH_WHISPER_MODEL - Whisper model name (default: "base")
|
|
18
|
-
* MONOGRAPH_WHISPER_PROMPT - Override initial prompt for Whisper
|
|
19
|
-
*/
|
|
20
|
-
|
|
21
|
-
import { execFile } from 'child_process';
|
|
22
|
-
import { promisify } from 'util';
|
|
23
|
-
import { createHash } from 'crypto';
|
|
24
|
-
import { mkdirSync, existsSync, writeFileSync } from 'fs';
|
|
25
|
-
import { readFile, writeFile } from 'fs/promises';
|
|
26
|
-
import path from 'path';
|
|
27
|
-
|
|
28
|
-
const execFileAsync = promisify(execFile);
|
|
29
|
-
|
|
30
|
-
// ── Constants ──────────────────────────────────────────────────────────────────
|
|
31
|
-
|
|
32
|
-
export const VIDEO_EXTENSIONS = new Set([
|
|
33
|
-
'.mp4', '.mov', '.webm', '.mkv', '.avi', '.m4v',
|
|
34
|
-
'.mp3', '.wav', '.m4a', '.ogg',
|
|
35
|
-
]);
|
|
36
|
-
|
|
37
|
-
const URL_PREFIXES = ['http://', 'https://', 'www.'];
|
|
38
|
-
const DEFAULT_MODEL = 'base';
|
|
39
|
-
const FALLBACK_PROMPT = 'Use proper punctuation and paragraph breaks.';
|
|
40
|
-
const DEFAULT_TRANSCRIPTS_DIR = 'monograph-out/transcripts';
|
|
41
|
-
|
|
42
|
-
// ── Helpers ────────────────────────────────────────────────────────────────────
|
|
43
|
-
|
|
44
|
-
export function isUrl(input: string): boolean {
|
|
45
|
-
return URL_PREFIXES.some(p => input.startsWith(p));
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function getModel(): string {
|
|
49
|
-
return process.env['MONOGRAPH_WHISPER_MODEL'] ?? DEFAULT_MODEL;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
async function whisperCliAvailable(): Promise<string | null> {
|
|
53
|
-
for (const cmd of ['faster-whisper', 'whisper']) {
|
|
54
|
-
try {
|
|
55
|
-
await execFileAsync(cmd, ['--help']);
|
|
56
|
-
return cmd;
|
|
57
|
-
} catch {
|
|
58
|
-
// not found — try next
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return null;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
async function ytdlpAvailable(): Promise<boolean> {
|
|
65
|
-
try {
|
|
66
|
-
await execFileAsync('yt-dlp', ['--version']);
|
|
67
|
-
return true;
|
|
68
|
-
} catch {
|
|
69
|
-
return false;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// ── Download audio ─────────────────────────────────────────────────────────────
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Download audio from a URL using yt-dlp.
|
|
77
|
-
* Returns the path to the downloaded audio file.
|
|
78
|
-
* Cached: if a file with the same URL hash already exists it is returned immediately.
|
|
79
|
-
*
|
|
80
|
-
* @throws {Error} if yt-dlp is not installed.
|
|
81
|
-
*/
|
|
82
|
-
export async function downloadAudio(url: string, outputDir: string): Promise<string> {
|
|
83
|
-
if (!await ytdlpAvailable()) {
|
|
84
|
-
throw new Error(
|
|
85
|
-
'Video URL download requires yt-dlp. Install it with: pip install yt-dlp',
|
|
86
|
-
);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
mkdirSync(outputDir, { recursive: true });
|
|
90
|
-
|
|
91
|
-
const urlHash = createHash('sha1').update(url).digest('hex').slice(0, 12);
|
|
92
|
-
const audioExts = ['.m4a', '.opus', '.mp3', '.ogg', '.wav', '.webm'];
|
|
93
|
-
|
|
94
|
-
// Return cached file if present
|
|
95
|
-
for (const ext of audioExts) {
|
|
96
|
-
const candidate = path.join(outputDir, `yt_${urlHash}${ext}`);
|
|
97
|
-
if (existsSync(candidate)) {
|
|
98
|
-
return candidate;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
const outTemplate = path.join(outputDir, `yt_${urlHash}.%(ext)s`);
|
|
103
|
-
await execFileAsync('yt-dlp', [
|
|
104
|
-
'--format', 'bestaudio[ext=m4a]/bestaudio/best',
|
|
105
|
-
'--output', outTemplate,
|
|
106
|
-
'--quiet',
|
|
107
|
-
'--no-warnings',
|
|
108
|
-
'--no-playlist',
|
|
109
|
-
url,
|
|
110
|
-
]);
|
|
111
|
-
|
|
112
|
-
// Find the downloaded file
|
|
113
|
-
for (const ext of audioExts) {
|
|
114
|
-
const candidate = path.join(outputDir, `yt_${urlHash}${ext}`);
|
|
115
|
-
if (existsSync(candidate)) return candidate;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
throw new Error(`yt-dlp download completed but output file not found for URL: ${url}`);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// ── Whisper prompt ─────────────────────────────────────────────────────────────
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Build a domain hint for Whisper from a set of god-node labels.
|
|
125
|
-
* Mirrors graphify's `build_whisper_prompt`.
|
|
126
|
-
*/
|
|
127
|
-
export function buildWhisperPrompt(godNodeLabels: string[]): string {
|
|
128
|
-
const override = process.env['MONOGRAPH_WHISPER_PROMPT'];
|
|
129
|
-
if (override) return override;
|
|
130
|
-
|
|
131
|
-
if (godNodeLabels.length === 0) return FALLBACK_PROMPT;
|
|
132
|
-
|
|
133
|
-
const topics = godNodeLabels.slice(0, 5).join(', ');
|
|
134
|
-
return `Technical discussion about ${topics}. Use proper punctuation and paragraph breaks.`;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// ── Transcribe one file ────────────────────────────────────────────────────────
|
|
138
|
-
|
|
139
|
-
export interface TranscribeOptions {
|
|
140
|
-
/** Directory to write transcript files. Default: monograph-out/transcripts */
|
|
141
|
-
outputDir?: string;
|
|
142
|
-
/** Initial prompt / domain hint passed to Whisper. */
|
|
143
|
-
initialPrompt?: string;
|
|
144
|
-
/** Re-transcribe even if transcript already exists. Default: false */
|
|
145
|
-
force?: boolean;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
export interface TranscribeResult {
|
|
149
|
-
transcriptPath: string;
|
|
150
|
-
/** Number of non-empty lines in the transcript. */
|
|
151
|
-
lineCount: number;
|
|
152
|
-
/** Whether the transcript was loaded from cache (not freshly generated). */
|
|
153
|
-
fromCache: boolean;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Transcribe a video/audio file or URL to a plain-text transcript.
|
|
158
|
-
*
|
|
159
|
-
* Requires either `faster-whisper` or `whisper` CLI to be on the PATH.
|
|
160
|
-
* For URLs, also requires `yt-dlp`.
|
|
161
|
-
*
|
|
162
|
-
* @param input - A local file path or a URL (http/https/www).
|
|
163
|
-
* @param options - Transcription options.
|
|
164
|
-
* @returns Resolved transcript path and metadata.
|
|
165
|
-
*/
|
|
166
|
-
export async function transcribe(
|
|
167
|
-
input: string,
|
|
168
|
-
options: TranscribeOptions = {},
|
|
169
|
-
): Promise<TranscribeResult> {
|
|
170
|
-
const outDir = options.outputDir ?? DEFAULT_TRANSCRIPTS_DIR;
|
|
171
|
-
mkdirSync(outDir, { recursive: true });
|
|
172
|
-
|
|
173
|
-
// Resolve audio path
|
|
174
|
-
let audioPath: string;
|
|
175
|
-
if (isUrl(input)) {
|
|
176
|
-
const dlDir = path.join(outDir, 'downloads');
|
|
177
|
-
audioPath = await downloadAudio(input, dlDir);
|
|
178
|
-
} else {
|
|
179
|
-
audioPath = input;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
const stem = path.basename(audioPath, path.extname(audioPath));
|
|
183
|
-
const transcriptPath = path.join(outDir, `${stem}.txt`);
|
|
184
|
-
|
|
185
|
-
// Return cached transcript if it exists
|
|
186
|
-
if (!options.force && existsSync(transcriptPath)) {
|
|
187
|
-
const content = await readFile(transcriptPath, 'utf-8');
|
|
188
|
-
const lines = content.split('\n').filter(l => l.trim().length > 0);
|
|
189
|
-
return { transcriptPath, lineCount: lines.length, fromCache: true };
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// Find available Whisper CLI
|
|
193
|
-
const whisperCmd = await whisperCliAvailable();
|
|
194
|
-
if (!whisperCmd) {
|
|
195
|
-
throw new Error(
|
|
196
|
-
'Video transcription requires faster-whisper or whisper CLI. ' +
|
|
197
|
-
'Install with: pip install faster-whisper or pip install openai-whisper',
|
|
198
|
-
);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
const model = getModel();
|
|
202
|
-
const prompt = options.initialPrompt ?? FALLBACK_PROMPT;
|
|
203
|
-
|
|
204
|
-
const args = [audioPath, '--model', model, '--output_format', 'txt', '--output_dir', outDir];
|
|
205
|
-
if (prompt) args.push('--initial_prompt', prompt);
|
|
206
|
-
|
|
207
|
-
await execFileAsync(whisperCmd, args);
|
|
208
|
-
|
|
209
|
-
// Whisper may write <stem>.txt directly or <stem>.<ext>.txt — normalise
|
|
210
|
-
if (!existsSync(transcriptPath)) {
|
|
211
|
-
// Try with original extension included in stem
|
|
212
|
-
const altPath = path.join(outDir, `${path.basename(audioPath)}.txt`);
|
|
213
|
-
if (existsSync(altPath)) {
|
|
214
|
-
// Rename to canonical path
|
|
215
|
-
const content = await readFile(altPath, 'utf-8');
|
|
216
|
-
writeFileSync(transcriptPath, content, 'utf-8');
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
const content = existsSync(transcriptPath)
|
|
221
|
-
? await readFile(transcriptPath, 'utf-8')
|
|
222
|
-
: '';
|
|
223
|
-
const lines = content.split('\n').filter(l => l.trim().length > 0);
|
|
224
|
-
|
|
225
|
-
return { transcriptPath, lineCount: lines.length, fromCache: false };
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
// ── Transcribe many ────────────────────────────────────────────────────────────
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* Transcribe a list of video/audio files or URLs.
|
|
232
|
-
* Already-transcribed files are returned from cache instantly.
|
|
233
|
-
* The `initialPrompt` is shared across all files.
|
|
234
|
-
*
|
|
235
|
-
* @param inputs - Array of file paths or URLs.
|
|
236
|
-
* @param options - Shared transcription options.
|
|
237
|
-
* @returns Array of TranscribeResult (one per input, in order).
|
|
238
|
-
*/
|
|
239
|
-
export async function transcribeAll(
|
|
240
|
-
inputs: string[],
|
|
241
|
-
options: TranscribeOptions = {},
|
|
242
|
-
): Promise<TranscribeResult[]> {
|
|
243
|
-
if (inputs.length === 0) return [];
|
|
244
|
-
|
|
245
|
-
const results: TranscribeResult[] = [];
|
|
246
|
-
for (const input of inputs) {
|
|
247
|
-
try {
|
|
248
|
-
results.push(await transcribe(input, options));
|
|
249
|
-
} catch (err) {
|
|
250
|
-
console.error(`[monograph transcribe] Failed for ${input}: ${(err as Error).message}`);
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
return results;
|
|
254
|
-
}
|
package/src/ingest/url-ingest.ts
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { createHash } from 'crypto';
|
|
2
|
-
import { validateUrl } from '../security/safe-fetch.js';
|
|
3
|
-
import { classifyFile } from '../analysis/file-classifier.js';
|
|
4
|
-
|
|
5
|
-
export type UrlType = 'paper' | 'github' | 'video' | 'webpage' | 'pdf' | 'image';
|
|
6
|
-
|
|
7
|
-
export interface IngestResult {
|
|
8
|
-
id: string;
|
|
9
|
-
url: string;
|
|
10
|
-
type: UrlType;
|
|
11
|
-
title: string;
|
|
12
|
-
snippet: string;
|
|
13
|
-
fetchedAt: string;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export interface IngestOptions {
|
|
17
|
-
fetch?: typeof globalThis.fetch;
|
|
18
|
-
maxBytes?: number;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const URL_TYPE_PATTERNS: Array<[RegExp, UrlType]> = [
|
|
22
|
-
[/arxiv\.org|semanticscholar\.org|openreview\.net/, 'paper'],
|
|
23
|
-
[/github\.com/, 'github'],
|
|
24
|
-
[/youtube\.com|youtu\.be/, 'video'],
|
|
25
|
-
[/\.pdf($|\?)/, 'pdf'],
|
|
26
|
-
];
|
|
27
|
-
|
|
28
|
-
export function classifyUrlType(url: string): UrlType {
|
|
29
|
-
for (const [pattern, type] of URL_TYPE_PATTERNS) {
|
|
30
|
-
if (pattern.test(url)) return type;
|
|
31
|
-
}
|
|
32
|
-
const fileType = classifyFile(url);
|
|
33
|
-
if (fileType === 'IMAGE') return 'image';
|
|
34
|
-
if (fileType === 'PAPER') return 'paper';
|
|
35
|
-
return 'webpage';
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function extractTitle(html: string): string {
|
|
39
|
-
const m = /<title[^>]*>([^<]+)<\/title>/i.exec(html);
|
|
40
|
-
return m ? m[1].trim() : 'Untitled';
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function extractSnippet(html: string, maxLen = 500): string {
|
|
44
|
-
const text = html
|
|
45
|
-
.replace(/<script[^>]*>[\s\S]*?<\/script>/gi, '')
|
|
46
|
-
.replace(/<style[^>]*>[\s\S]*?<\/style>/gi, '')
|
|
47
|
-
.replace(/<[^>]+>/g, ' ')
|
|
48
|
-
.replace(/\s+/g, ' ')
|
|
49
|
-
.trim();
|
|
50
|
-
return text.slice(0, maxLen);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export async function ingestUrl(url: string, options: IngestOptions = {}): Promise<IngestResult> {
|
|
54
|
-
validateUrl(url);
|
|
55
|
-
|
|
56
|
-
const { fetch: fetchFn = globalThis.fetch, maxBytes = 10 * 1024 * 1024 } = options;
|
|
57
|
-
|
|
58
|
-
const response = await fetchFn(url, { redirect: 'follow' } as RequestInit);
|
|
59
|
-
if (!response.ok) throw new Error(`HTTP ${response.status} fetching ${url}`);
|
|
60
|
-
// Re-validate the final URL after redirects to prevent SSRF via open redirects.
|
|
61
|
-
// Only validate when response.url is truthy (some fetch impls omit it on same-URL responses).
|
|
62
|
-
if (response.url) validateUrl(response.url);
|
|
63
|
-
|
|
64
|
-
const contentLength = response.headers.get('content-length');
|
|
65
|
-
if (contentLength && parseInt(contentLength, 10) > maxBytes) {
|
|
66
|
-
throw new Error(`Response too large: ${contentLength} bytes exceeds ${maxBytes}`);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const text = await response.text();
|
|
70
|
-
if (text.length > maxBytes) throw new Error(`Response too large: body exceeds ${maxBytes} bytes`);
|
|
71
|
-
|
|
72
|
-
const type = classifyUrlType(url);
|
|
73
|
-
const contentType = response.headers.get('content-type') ?? '';
|
|
74
|
-
const isHtml = contentType.includes('text/html') || text.trimStart().startsWith('<');
|
|
75
|
-
|
|
76
|
-
const title = isHtml ? extractTitle(text) : (url.split('/').pop() ?? url);
|
|
77
|
-
const snippet = isHtml ? extractSnippet(text) : text.slice(0, 500);
|
|
78
|
-
|
|
79
|
-
return {
|
|
80
|
-
id: createHash('sha256').update(url).digest('hex').slice(0, 16),
|
|
81
|
-
url,
|
|
82
|
-
type,
|
|
83
|
-
title,
|
|
84
|
-
snippet,
|
|
85
|
-
fetchedAt: new Date().toISOString(),
|
|
86
|
-
};
|
|
87
|
-
}
|
package/src/init/agent-hooks.ts
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
// Install/uninstall monograph quality gate into AI coding agents (Claude Code, Codex).
|
|
2
|
-
|
|
3
|
-
export type AgentHooksTarget = 'claude-code' | 'codex' | 'auto';
|
|
4
|
-
|
|
5
|
-
export interface SetupHooksOptions {
|
|
6
|
-
root: string;
|
|
7
|
-
target?: AgentHooksTarget;
|
|
8
|
-
command?: string;
|
|
9
|
-
uninstall?: boolean;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export interface SetupHooksResult {
|
|
13
|
-
target: AgentHooksTarget;
|
|
14
|
-
installed: boolean;
|
|
15
|
-
modifiedFiles: string[];
|
|
16
|
-
message: string;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export const AGENTS_BLOCK_START = '<!-- monograph-gate-start -->';
|
|
20
|
-
export const AGENTS_BLOCK_END = '<!-- monograph-gate-end -->';
|
|
21
|
-
export const MONOGRAPH_GATE_SCRIPT = 'npx monograph check --since $(git merge-base HEAD main)';
|
|
22
|
-
|
|
23
|
-
/** Build the AGENTS.md block content. */
|
|
24
|
-
export function buildAgentsMdBlock(command: string): string {
|
|
25
|
-
return [
|
|
26
|
-
AGENTS_BLOCK_START,
|
|
27
|
-
'',
|
|
28
|
-
'## Pre-commit Quality Gate (monograph)',
|
|
29
|
-
'',
|
|
30
|
-
'Before completing any coding task, run:',
|
|
31
|
-
'',
|
|
32
|
-
'```sh',
|
|
33
|
-
command,
|
|
34
|
-
'```',
|
|
35
|
-
'',
|
|
36
|
-
'Fix any new issues before marking the task complete.',
|
|
37
|
-
'',
|
|
38
|
-
AGENTS_BLOCK_END,
|
|
39
|
-
].join('\n');
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/** Merge the monograph gate block into AGENTS.md content (idempotent). */
|
|
43
|
-
export function mergeAgentsMdBlock(existing: string, block: string): string {
|
|
44
|
-
const startIdx = existing.indexOf(AGENTS_BLOCK_START);
|
|
45
|
-
const endIdx = existing.indexOf(AGENTS_BLOCK_END);
|
|
46
|
-
if (startIdx !== -1 && endIdx !== -1) {
|
|
47
|
-
return existing.slice(0, startIdx) + block + existing.slice(endIdx + AGENTS_BLOCK_END.length);
|
|
48
|
-
}
|
|
49
|
-
return existing ? existing + '\n\n' + block : block;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/** Remove the managed block from AGENTS.md. */
|
|
53
|
-
export function removeAgentsMdBlock(content: string): string {
|
|
54
|
-
const startIdx = content.indexOf(AGENTS_BLOCK_START);
|
|
55
|
-
const endIdx = content.indexOf(AGENTS_BLOCK_END);
|
|
56
|
-
if (startIdx === -1 || endIdx === -1) return content;
|
|
57
|
-
return content.slice(0, startIdx).trimEnd() + '\n' + content.slice(endIdx + AGENTS_BLOCK_END.length).trimStart();
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/** Build a Claude Code settings.json PreToolUse hook entry. */
|
|
61
|
-
export function buildClaudeCodeHookEntry(command: string): Record<string, unknown> {
|
|
62
|
-
return {
|
|
63
|
-
hooks: {
|
|
64
|
-
PreToolUse: [
|
|
65
|
-
{
|
|
66
|
-
matcher: 'Edit|Write|MultiEdit',
|
|
67
|
-
hooks: [{ type: 'command', command: `sh -c '${command} --quiet || true'` }],
|
|
68
|
-
},
|
|
69
|
-
],
|
|
70
|
-
},
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/** Merge a hook entry into an existing Claude Code settings object (idempotent). */
|
|
75
|
-
export function mergeClaudeCodeSettings(
|
|
76
|
-
existing: Record<string, unknown>,
|
|
77
|
-
entry: Record<string, unknown>,
|
|
78
|
-
): Record<string, unknown> {
|
|
79
|
-
const result = { $schema: '', ...existing, ...entry };
|
|
80
|
-
if (!result.$schema) { (result as Record<string, unknown>).$schema = undefined; }
|
|
81
|
-
return result;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
export const DEFAULT_SETUP_RESULT: SetupHooksResult = {
|
|
85
|
-
target: 'auto', installed: false, modifiedFiles: [], message: 'No agent detected',
|
|
86
|
-
};
|
package/src/init/git-hooks.ts
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
// Detect git hooks manager and install/uninstall a pre-commit monograph gate.
|
|
2
|
-
|
|
3
|
-
export type GitHooksManager = 'husky' | 'lefthook' | 'raw' | 'none';
|
|
4
|
-
|
|
5
|
-
export interface GitHooksInstallOptions {
|
|
6
|
-
root: string;
|
|
7
|
-
branch?: string;
|
|
8
|
-
command?: string;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export interface GitHooksInstallResult {
|
|
12
|
-
manager: GitHooksManager;
|
|
13
|
-
installed: boolean;
|
|
14
|
-
hookPath: string;
|
|
15
|
-
message: string;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const MANAGED_BLOCK_START = '# monograph-gate-start';
|
|
19
|
-
const MANAGED_BLOCK_END = '# monograph-gate-end';
|
|
20
|
-
|
|
21
|
-
/** Detect which hooks manager is active in the project. */
|
|
22
|
-
export function detectHooksManager(rootFiles: string[]): GitHooksManager {
|
|
23
|
-
if (rootFiles.some(f => f.includes('.husky/'))) return 'husky';
|
|
24
|
-
if (rootFiles.some(f => f.includes('lefthook.yml') || f.includes('lefthook.yaml'))) return 'lefthook';
|
|
25
|
-
if (rootFiles.some(f => f.includes('.git/hooks/'))) return 'raw';
|
|
26
|
-
return 'none';
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/** Validate a branch name against shell injection. */
|
|
30
|
-
export function validateBranchName(branch: string): boolean {
|
|
31
|
-
return /^[a-zA-Z0-9/_.\-]+$/.test(branch) && !branch.includes('..') && branch.length < 256;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/** Generate the pre-commit hook script content. */
|
|
35
|
-
export function renderedHookScript(opts: GitHooksInstallOptions): string {
|
|
36
|
-
const branch = opts.branch ?? 'main';
|
|
37
|
-
const cmd = opts.command ?? 'npx monograph check';
|
|
38
|
-
return [
|
|
39
|
-
'#!/bin/sh',
|
|
40
|
-
MANAGED_BLOCK_START,
|
|
41
|
-
`BASE=$(git merge-base HEAD ${branch} 2>/dev/null || echo "")`,
|
|
42
|
-
`if [ -n "$BASE" ]; then`,
|
|
43
|
-
` ${cmd} --since "$BASE"`,
|
|
44
|
-
`else`,
|
|
45
|
-
` ${cmd}`,
|
|
46
|
-
`fi`,
|
|
47
|
-
MANAGED_BLOCK_END,
|
|
48
|
-
].join('\n');
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/** Build the hook content by merging with existing content (idempotent). */
|
|
52
|
-
export function mergeHookContent(existing: string, script: string): string {
|
|
53
|
-
const startIdx = existing.indexOf(MANAGED_BLOCK_START);
|
|
54
|
-
const endIdx = existing.indexOf(MANAGED_BLOCK_END);
|
|
55
|
-
if (startIdx !== -1 && endIdx !== -1) {
|
|
56
|
-
return existing.slice(0, startIdx) + script + existing.slice(endIdx + MANAGED_BLOCK_END.length);
|
|
57
|
-
}
|
|
58
|
-
return existing ? existing + '\n' + script : script;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/** Remove the managed block from hook content. */
|
|
62
|
-
export function removeHookBlock(content: string): string {
|
|
63
|
-
const startIdx = content.indexOf(MANAGED_BLOCK_START);
|
|
64
|
-
const endIdx = content.indexOf(MANAGED_BLOCK_END);
|
|
65
|
-
if (startIdx === -1 || endIdx === -1) return content;
|
|
66
|
-
return content.slice(0, startIdx).trimEnd() + content.slice(endIdx + MANAGED_BLOCK_END.length);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export const GIT_HOOK_INSTALL_RESULT_NONE: GitHooksInstallResult = {
|
|
70
|
-
manager: 'none', installed: false, hookPath: '', message: 'No hooks manager detected',
|
|
71
|
-
};
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
// Inspects a project root to scaffold a tailored monograph config.
|
|
2
|
-
|
|
3
|
-
export type DetectedFramework = 'react' | 'vue' | 'svelte' | 'angular' | 'none';
|
|
4
|
-
export type DetectedTestRunner = 'vitest' | 'jest' | 'playwright' | 'none';
|
|
5
|
-
export type DetectedPackageManager = 'pnpm' | 'yarn' | 'npm' | 'bun' | 'unknown';
|
|
6
|
-
export type DetectedMonorepoTool = 'pnpm-workspaces' | 'npm-workspaces' | 'yarn-workspaces' | 'nx' | 'turborepo' | 'none';
|
|
7
|
-
|
|
8
|
-
export interface ProjectInfo {
|
|
9
|
-
root: string;
|
|
10
|
-
hasTypeScript: boolean;
|
|
11
|
-
framework: DetectedFramework;
|
|
12
|
-
testRunner: DetectedTestRunner;
|
|
13
|
-
packageManager: DetectedPackageManager;
|
|
14
|
-
monorepoTool: DetectedMonorepoTool;
|
|
15
|
-
workspaceGlobs: string[];
|
|
16
|
-
hasStorybook: boolean;
|
|
17
|
-
entryPoints: string[];
|
|
18
|
-
testPatterns: string[];
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export function detectFramework(deps: Record<string, string>): DetectedFramework {
|
|
22
|
-
if ('react' in deps || 'react-dom' in deps) return 'react';
|
|
23
|
-
if ('vue' in deps) return 'vue';
|
|
24
|
-
if ('svelte' in deps) return 'svelte';
|
|
25
|
-
if ('@angular/core' in deps) return 'angular';
|
|
26
|
-
return 'none';
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function detectTestRunner(deps: Record<string, string>): DetectedTestRunner {
|
|
30
|
-
if ('vitest' in deps) return 'vitest';
|
|
31
|
-
if ('jest' in deps || '@jest/core' in deps) return 'jest';
|
|
32
|
-
if ('@playwright/test' in deps) return 'playwright';
|
|
33
|
-
return 'none';
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export function detectPackageManager(files: string[]): DetectedPackageManager {
|
|
37
|
-
if (files.includes('pnpm-lock.yaml')) return 'pnpm';
|
|
38
|
-
if (files.includes('bun.lockb')) return 'bun';
|
|
39
|
-
if (files.includes('yarn.lock')) return 'yarn';
|
|
40
|
-
if (files.includes('package-lock.json')) return 'npm';
|
|
41
|
-
return 'unknown';
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export function detectProject(
|
|
45
|
-
rootFiles: string[],
|
|
46
|
-
packageJson: { dependencies?: Record<string, string>; devDependencies?: Record<string, string>; workspaces?: string[] | { packages: string[] } } | null,
|
|
47
|
-
hasPnpmWorkspace: boolean,
|
|
48
|
-
): ProjectInfo {
|
|
49
|
-
const allDeps = { ...(packageJson?.dependencies ?? {}), ...(packageJson?.devDependencies ?? {}) };
|
|
50
|
-
|
|
51
|
-
const workspaceGlobs = hasPnpmWorkspace
|
|
52
|
-
? ['packages/*']
|
|
53
|
-
: Array.isArray(packageJson?.workspaces)
|
|
54
|
-
? packageJson.workspaces
|
|
55
|
-
: (packageJson?.workspaces as { packages?: string[] })?.packages ?? [];
|
|
56
|
-
|
|
57
|
-
const monorepoTool: DetectedMonorepoTool = hasPnpmWorkspace
|
|
58
|
-
? 'pnpm-workspaces'
|
|
59
|
-
: workspaceGlobs.length > 0
|
|
60
|
-
? 'npm-workspaces'
|
|
61
|
-
: 'none';
|
|
62
|
-
|
|
63
|
-
const framework = detectFramework(allDeps);
|
|
64
|
-
const testRunner = detectTestRunner(allDeps);
|
|
65
|
-
const packageManager = detectPackageManager(rootFiles);
|
|
66
|
-
|
|
67
|
-
const testPatterns = testRunner !== 'none'
|
|
68
|
-
? ['**/*.test.{ts,tsx,js,jsx}', '**/*.spec.{ts,tsx,js,jsx}']
|
|
69
|
-
: [];
|
|
70
|
-
|
|
71
|
-
const entryPoints = ['src/index.ts', 'src/index.tsx', 'src/main.ts', 'index.ts']
|
|
72
|
-
.filter(ep => rootFiles.some(f => f.endsWith(ep.replace('src/', ''))));
|
|
73
|
-
|
|
74
|
-
return {
|
|
75
|
-
root: '',
|
|
76
|
-
hasTypeScript: rootFiles.includes('tsconfig.json'),
|
|
77
|
-
framework,
|
|
78
|
-
testRunner,
|
|
79
|
-
packageManager,
|
|
80
|
-
monorepoTool,
|
|
81
|
-
workspaceGlobs,
|
|
82
|
-
hasStorybook: rootFiles.some(f => f.includes('.storybook')),
|
|
83
|
-
entryPoints: entryPoints.length > 0 ? entryPoints : ['src/index.ts'],
|
|
84
|
-
testPatterns,
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export function buildJsonConfig(info: ProjectInfo): string {
|
|
89
|
-
const config = {
|
|
90
|
-
$schema: 'https://monograph.dev/schema.json',
|
|
91
|
-
entryPoints: info.entryPoints,
|
|
92
|
-
ignore: ['**/*.d.ts', '**/*.test.*', '**/*.spec.*', ...(info.testPatterns.length > 0 ? info.testPatterns : [])],
|
|
93
|
-
...(info.workspaceGlobs.length > 0 ? { workspaces: info.workspaceGlobs } : {}),
|
|
94
|
-
};
|
|
95
|
-
return JSON.stringify(config, null, 2);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
export function buildTomlConfig(info: ProjectInfo): string {
|
|
99
|
-
const lines = ['[monograph]'];
|
|
100
|
-
lines.push(`entry_points = [${info.entryPoints.map(e => `"${e}"`).join(', ')}]`);
|
|
101
|
-
if (info.workspaceGlobs.length > 0) {
|
|
102
|
-
lines.push(`workspaces = [${info.workspaceGlobs.map(g => `"${g}"`).join(', ')}]`);
|
|
103
|
-
}
|
|
104
|
-
return lines.join('\n');
|
|
105
|
-
}
|