mdcontext 0.1.0 → 0.2.0
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/.changeset/config.json +9 -9
- package/.claude/settings.local.json +25 -0
- package/.github/workflows/claude-code-review.yml +44 -0
- package/.github/workflows/claude.yml +85 -0
- package/CONTRIBUTING.md +186 -0
- package/NOTES/NOTES +44 -0
- package/README.md +206 -3
- package/biome.json +1 -1
- package/dist/chunk-23UPXDNL.js +3044 -0
- package/dist/chunk-2W7MO2DL.js +1366 -0
- package/dist/chunk-3NUAZGMA.js +1689 -0
- package/dist/chunk-7TOWB2XB.js +366 -0
- package/dist/chunk-7XOTOADQ.js +3065 -0
- package/dist/chunk-AH2PDM2K.js +3042 -0
- package/dist/chunk-BNXWSZ63.js +3742 -0
- package/dist/chunk-BTL5DJVU.js +3222 -0
- package/dist/chunk-HDHYG7E4.js +104 -0
- package/dist/chunk-HLR4KZBP.js +3234 -0
- package/dist/chunk-IP3FRFEB.js +1045 -0
- package/dist/chunk-KHU56VDO.js +3042 -0
- package/dist/chunk-KRYIFLQR.js +85 -89
- package/dist/chunk-LBSDNLEM.js +287 -0
- package/dist/chunk-MNTQ7HCP.js +2643 -0
- package/dist/chunk-MUJELQQ6.js +1387 -0
- package/dist/chunk-MXJGMSLV.js +2199 -0
- package/dist/chunk-N6QJGC3Z.js +2636 -0
- package/dist/chunk-OBELGBPM.js +1713 -0
- package/dist/chunk-OT7R5XTA.js +3192 -0
- package/dist/chunk-P7X4RA2T.js +106 -0
- package/dist/chunk-PIDUQNC2.js +3185 -0
- package/dist/chunk-POGCDIH4.js +3187 -0
- package/dist/chunk-PSIEOQGZ.js +3043 -0
- package/dist/chunk-PVRT3IHA.js +3238 -0
- package/dist/chunk-QNN4TT23.js +1430 -0
- package/dist/chunk-RE3R45RJ.js +3042 -0
- package/dist/chunk-S7E6TFX6.js +718 -657
- package/dist/chunk-SG6GLU4U.js +1378 -0
- package/dist/chunk-SJCDV2ST.js +274 -0
- package/dist/chunk-SYE5XLF3.js +104 -0
- package/dist/chunk-T5VLYBZD.js +103 -0
- package/dist/chunk-TOQB7VWU.js +3238 -0
- package/dist/chunk-VFNMZ4ZQ.js +3228 -0
- package/dist/chunk-VVTGZNBT.js +1533 -1423
- package/dist/chunk-W7Q4RFEV.js +104 -0
- package/dist/chunk-XTYYVRLO.js +3190 -0
- package/dist/chunk-Y6MDYVJD.js +3063 -0
- package/dist/cli/main.js +4072 -629
- package/dist/index.d.ts +420 -33
- package/dist/index.js +8 -15
- package/dist/mcp/server.js +103 -7
- package/dist/schema-BAWSG7KY.js +22 -0
- package/dist/schema-E3QUPL26.js +20 -0
- package/dist/schema-EHL7WUT6.js +20 -0
- package/docs/019-USAGE.md +44 -5
- package/docs/020-current-implementation.md +8 -8
- package/docs/021-DOGFOODING-FINDINGS.md +1 -1
- package/docs/CONFIG.md +1123 -0
- package/docs/ERRORS.md +383 -0
- package/docs/summarization.md +320 -0
- package/justfile +40 -0
- package/package.json +39 -33
- package/research/INDEX.md +315 -0
- package/research/code-review/README.md +90 -0
- package/research/code-review/cli-error-handling-review.md +979 -0
- package/research/code-review/code-review-validation-report.md +464 -0
- package/research/code-review/main-ts-review.md +1128 -0
- package/research/config-docs/SUMMARY.md +357 -0
- package/research/config-docs/TEST-RESULTS.md +776 -0
- package/research/config-docs/TODO.md +542 -0
- package/research/config-docs/analysis.md +744 -0
- package/research/config-docs/fix-validation.md +502 -0
- package/research/config-docs/help-audit.md +264 -0
- package/research/config-docs/help-system-analysis.md +890 -0
- package/research/frontmatter/COMMENTS-ARE-SKIPPED.md +149 -0
- package/research/frontmatter/LLM-CODE-NAVIGATION.md +276 -0
- package/research/issue-review.md +603 -0
- package/research/llm-summarization/agent-cli-tools-2026.md +1082 -0
- package/research/llm-summarization/alternative-providers-2026.md +1428 -0
- package/research/llm-summarization/anthropic-2026.md +367 -0
- package/research/llm-summarization/claude-cli-integration.md +1706 -0
- package/research/llm-summarization/cli-integration-patterns.md +3155 -0
- package/research/llm-summarization/openai-2026.md +473 -0
- package/research/llm-summarization/openai-compatible-providers-2026.md +1022 -0
- package/research/llm-summarization/opencode-cli-integration.md +1552 -0
- package/research/llm-summarization/prompt-engineering-2026.md +1426 -0
- package/research/llm-summarization/prototype-results.md +56 -0
- package/research/llm-summarization/provider-switching-patterns-2026.md +2153 -0
- package/research/llm-summarization/typescript-llm-libraries-2026.md +2436 -0
- package/research/mdcontext-pudding/00-EXECUTIVE-SUMMARY.md +282 -0
- package/research/mdcontext-pudding/01-index-embed.md +956 -0
- package/research/mdcontext-pudding/02-search-COMMANDS.md +142 -0
- package/research/mdcontext-pudding/02-search-SUMMARY.md +146 -0
- package/research/mdcontext-pudding/02-search.md +970 -0
- package/research/mdcontext-pudding/03-context.md +779 -0
- package/research/mdcontext-pudding/04-navigation-and-analytics.md +803 -0
- package/research/mdcontext-pudding/04-tree.md +704 -0
- package/research/mdcontext-pudding/05-config.md +1038 -0
- package/research/mdcontext-pudding/06-links-summary.txt +87 -0
- package/research/mdcontext-pudding/06-links.md +679 -0
- package/research/mdcontext-pudding/07-stats.md +693 -0
- package/research/mdcontext-pudding/BUG-FIX-PLAN.md +388 -0
- package/research/mdcontext-pudding/P0-BUG-VALIDATION.md +167 -0
- package/research/mdcontext-pudding/README.md +168 -0
- package/research/mdcontext-pudding/TESTING-SUMMARY.md +128 -0
- package/research/research-quality-review.md +834 -0
- package/research/semantic-search/embedding-text-analysis.md +156 -0
- package/research/semantic-search/multi-word-failure-reproduction.md +171 -0
- package/research/semantic-search/query-processing-analysis.md +207 -0
- package/research/semantic-search/root-cause-and-solution.md +114 -0
- package/research/semantic-search/threshold-validation-report.md +69 -0
- package/research/semantic-search/vector-search-analysis.md +63 -0
- package/research/test-path-issues.md +276 -0
- package/review/ALP-76/1-error-type-design.md +962 -0
- package/review/ALP-76/2-error-handling-patterns.md +906 -0
- package/review/ALP-76/3-error-presentation.md +624 -0
- package/review/ALP-76/4-test-coverage.md +625 -0
- package/review/ALP-76/5-migration-completeness.md +440 -0
- package/review/ALP-76/6-effect-best-practices.md +755 -0
- package/scripts/apply-branch-protection.sh +47 -0
- package/scripts/branch-protection-templates.json +79 -0
- package/scripts/prototype-summarization.ts +346 -0
- package/scripts/rebuild-hnswlib.js +32 -37
- package/scripts/setup-branch-protection.sh +64 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/active-provider.json +7 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/bm25.json +541 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/bm25.meta.json +5 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/config.json +8 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.bin +0 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.meta.bin +0 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/indexes/documents.json +60 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/indexes/links.json +13 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/indexes/sections.json +1197 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/configuration-management.md +99 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/distributed-systems.md +92 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/error-handling.md +78 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/failure-automation.md +55 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/job-context.md +69 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/process-orchestration.md +99 -0
- package/src/cli/argv-preprocessor.test.ts +2 -2
- package/src/cli/cli.test.ts +230 -33
- package/src/cli/commands/config-cmd.ts +642 -0
- package/src/cli/commands/context.ts +97 -9
- package/src/cli/commands/duplicates.ts +122 -0
- package/src/cli/commands/embeddings.ts +529 -0
- package/src/cli/commands/index-cmd.ts +210 -30
- package/src/cli/commands/index.ts +3 -0
- package/src/cli/commands/search.ts +894 -64
- package/src/cli/commands/stats.ts +3 -0
- package/src/cli/commands/tree.ts +26 -5
- package/src/cli/config-layer.ts +176 -0
- package/src/cli/error-handler.test.ts +235 -0
- package/src/cli/error-handler.ts +655 -0
- package/src/cli/flag-schemas.ts +66 -0
- package/src/cli/help.ts +209 -7
- package/src/cli/main.ts +348 -58
- package/src/cli/options.ts +10 -0
- package/src/cli/shared-error-handling.ts +199 -0
- package/src/cli/utils.ts +150 -17
- package/src/config/file-provider.test.ts +320 -0
- package/src/config/file-provider.ts +273 -0
- package/src/config/index.ts +72 -0
- package/src/config/integration.test.ts +667 -0
- package/src/config/precedence.test.ts +277 -0
- package/src/config/precedence.ts +451 -0
- package/src/config/schema.test.ts +414 -0
- package/src/config/schema.ts +603 -0
- package/src/config/service.test.ts +320 -0
- package/src/config/service.ts +243 -0
- package/src/config/testing.test.ts +264 -0
- package/src/config/testing.ts +110 -0
- package/src/core/types.ts +6 -33
- package/src/duplicates/detector.test.ts +183 -0
- package/src/duplicates/detector.ts +414 -0
- package/src/duplicates/index.ts +18 -0
- package/src/embeddings/embedding-namespace.test.ts +300 -0
- package/src/embeddings/embedding-namespace.ts +947 -0
- package/src/embeddings/heading-boost.test.ts +222 -0
- package/src/embeddings/hnsw-build-options.test.ts +198 -0
- package/src/embeddings/hyde.test.ts +272 -0
- package/src/embeddings/hyde.ts +264 -0
- package/src/embeddings/index.ts +2 -0
- package/src/embeddings/openai-provider.ts +332 -83
- package/src/embeddings/pricing.json +22 -0
- package/src/embeddings/provider-constants.ts +204 -0
- package/src/embeddings/provider-errors.test.ts +967 -0
- package/src/embeddings/provider-errors.ts +565 -0
- package/src/embeddings/provider-factory.test.ts +240 -0
- package/src/embeddings/provider-factory.ts +225 -0
- package/src/embeddings/provider-integration.test.ts +788 -0
- package/src/embeddings/query-preprocessing.test.ts +187 -0
- package/src/embeddings/semantic-search-threshold.test.ts +508 -0
- package/src/embeddings/semantic-search.ts +780 -93
- package/src/embeddings/types.ts +293 -16
- package/src/embeddings/vector-store.ts +486 -77
- package/src/embeddings/voyage-provider.ts +313 -0
- package/src/errors/errors.test.ts +845 -0
- package/src/errors/index.ts +533 -0
- package/src/index/ignore-patterns.test.ts +354 -0
- package/src/index/ignore-patterns.ts +305 -0
- package/src/index/indexer.ts +286 -48
- package/src/index/storage.ts +94 -30
- package/src/index/types.ts +40 -2
- package/src/index/watcher.ts +67 -9
- package/src/index.ts +22 -0
- package/src/integration/search-keyword.test.ts +678 -0
- package/src/mcp/server.ts +135 -6
- package/src/parser/parser.ts +18 -19
- package/src/parser/section-filter.test.ts +277 -0
- package/src/parser/section-filter.ts +125 -3
- package/src/search/__tests__/hybrid-search.test.ts +650 -0
- package/src/search/bm25-store.ts +366 -0
- package/src/search/cross-encoder.test.ts +253 -0
- package/src/search/cross-encoder.ts +406 -0
- package/src/search/fuzzy-search.test.ts +419 -0
- package/src/search/fuzzy-search.ts +273 -0
- package/src/search/hybrid-search.ts +448 -0
- package/src/search/path-matcher.test.ts +276 -0
- package/src/search/path-matcher.ts +33 -0
- package/src/search/searcher.test.ts +99 -1
- package/src/search/searcher.ts +189 -67
- package/src/search/wink-bm25.d.ts +30 -0
- package/src/summarization/cli-providers/claude.ts +202 -0
- package/src/summarization/cli-providers/detection.test.ts +273 -0
- package/src/summarization/cli-providers/detection.ts +118 -0
- package/src/summarization/cli-providers/index.ts +8 -0
- package/src/summarization/cost.test.ts +139 -0
- package/src/summarization/cost.ts +102 -0
- package/src/summarization/error-handler.test.ts +127 -0
- package/src/summarization/error-handler.ts +111 -0
- package/src/summarization/index.ts +102 -0
- package/src/summarization/pipeline.test.ts +498 -0
- package/src/summarization/pipeline.ts +231 -0
- package/src/summarization/prompts.test.ts +269 -0
- package/src/summarization/prompts.ts +133 -0
- package/src/summarization/provider-factory.test.ts +396 -0
- package/src/summarization/provider-factory.ts +178 -0
- package/src/summarization/types.ts +184 -0
- package/src/summarize/summarizer.ts +104 -35
- package/src/types/huggingface-transformers.d.ts +66 -0
- package/tests/fixtures/cli/.mdcontext/active-provider.json +7 -0
- package/tests/fixtures/cli/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.bin +0 -0
- package/tests/fixtures/cli/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.meta.bin +0 -0
- package/tests/fixtures/cli/.mdcontext/indexes/documents.json +4 -4
- package/tests/fixtures/cli/.mdcontext/indexes/sections.json +14 -0
- package/tests/integration/embed-index.test.ts +712 -0
- package/tests/integration/search-context.test.ts +469 -0
- package/tests/integration/search-semantic.test.ts +522 -0
- package/vitest.config.ts +1 -6
- package/AGENTS.md +0 -46
- package/tests/fixtures/cli/.mdcontext/vectors.bin +0 -0
- package/tests/fixtures/cli/.mdcontext/vectors.meta.json +0 -1264
package/src/cli/flag-schemas.ts
CHANGED
|
@@ -83,6 +83,43 @@ export const indexSchema: CommandSchema = {
|
|
|
83
83
|
type: 'boolean',
|
|
84
84
|
description: 'Skip semantic search prompt',
|
|
85
85
|
},
|
|
86
|
+
{
|
|
87
|
+
name: 'exclude',
|
|
88
|
+
type: 'string',
|
|
89
|
+
alias: 'x',
|
|
90
|
+
description: 'Additional patterns to exclude (comma-separated)',
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
name: 'no-gitignore',
|
|
94
|
+
type: 'boolean',
|
|
95
|
+
description: 'Ignore .gitignore file',
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
name: 'provider',
|
|
99
|
+
type: 'string',
|
|
100
|
+
description:
|
|
101
|
+
'Embedding provider: openai, ollama, lm-studio, openrouter, voyage',
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: 'provider-base-url',
|
|
105
|
+
type: 'string',
|
|
106
|
+
description: 'Custom API base URL for the provider',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
name: 'provider-model',
|
|
110
|
+
type: 'string',
|
|
111
|
+
description: 'Model name (e.g., nomic-embed-text for Ollama)',
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
name: 'hnsw-m',
|
|
115
|
+
type: 'string',
|
|
116
|
+
description: 'HNSW M parameter',
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
name: 'hnsw-ef-construction',
|
|
120
|
+
type: 'string',
|
|
121
|
+
description: 'HNSW efConstruction parameter',
|
|
122
|
+
},
|
|
86
123
|
{
|
|
87
124
|
name: 'watch',
|
|
88
125
|
type: 'boolean',
|
|
@@ -141,6 +178,28 @@ export const searchSchema: CommandSchema = {
|
|
|
141
178
|
alias: 'A',
|
|
142
179
|
description: 'Lines of context after matches (like grep -A)',
|
|
143
180
|
},
|
|
181
|
+
{
|
|
182
|
+
name: 'fuzzy',
|
|
183
|
+
type: 'boolean',
|
|
184
|
+
alias: 'f',
|
|
185
|
+
description: 'Enable fuzzy matching for typo tolerance',
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
name: 'stem',
|
|
189
|
+
type: 'boolean',
|
|
190
|
+
description: 'Enable word stemming (fail matches failure, failed)',
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
name: 'fuzzy-distance',
|
|
194
|
+
type: 'string',
|
|
195
|
+
description: 'Max edit distance for fuzzy matching (default: 2)',
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
name: 'refine',
|
|
199
|
+
type: 'string',
|
|
200
|
+
description:
|
|
201
|
+
'Additional filter to narrow results (can be used multiple times)',
|
|
202
|
+
},
|
|
144
203
|
jsonFlag,
|
|
145
204
|
prettyFlag,
|
|
146
205
|
],
|
|
@@ -168,6 +227,13 @@ export const contextSchema: CommandSchema = {
|
|
|
168
227
|
type: 'boolean',
|
|
169
228
|
description: 'Exclude nested subsections when filtering',
|
|
170
229
|
},
|
|
230
|
+
{
|
|
231
|
+
name: 'exclude',
|
|
232
|
+
type: 'string',
|
|
233
|
+
alias: 'x',
|
|
234
|
+
description:
|
|
235
|
+
'Exclude sections matching pattern (can be used multiple times)',
|
|
236
|
+
},
|
|
171
237
|
jsonFlag,
|
|
172
238
|
prettyFlag,
|
|
173
239
|
],
|
package/src/cli/help.ts
CHANGED
|
@@ -32,6 +32,10 @@ export const helpContent: Record<string, CommandHelp> = {
|
|
|
32
32
|
'mdcontext index --watch # Watch for file changes',
|
|
33
33
|
'mdcontext index --embed --watch # Full setup with live updates',
|
|
34
34
|
'mdcontext index --force # Rebuild from scratch',
|
|
35
|
+
'',
|
|
36
|
+
'# Alternative embedding providers:',
|
|
37
|
+
'mdcontext index --embed --provider ollama --provider-model nomic-embed-text',
|
|
38
|
+
'mdcontext index --embed --provider openrouter',
|
|
35
39
|
],
|
|
36
40
|
options: [
|
|
37
41
|
{
|
|
@@ -42,6 +46,23 @@ export const helpContent: Record<string, CommandHelp> = {
|
|
|
42
46
|
name: '--no-embed',
|
|
43
47
|
description: 'Skip the prompt to enable semantic search',
|
|
44
48
|
},
|
|
49
|
+
{
|
|
50
|
+
name: '--provider <name>',
|
|
51
|
+
description:
|
|
52
|
+
'Embedding provider: openai, ollama, lm-studio, openrouter, voyage',
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: '--provider-model <model>',
|
|
56
|
+
description: 'Model name (e.g., nomic-embed-text for Ollama)',
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: '--provider-base-url <url>',
|
|
60
|
+
description: 'Custom API base URL for the provider',
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: '-t, --timeout <ms>',
|
|
64
|
+
description: 'Embedding API timeout in milliseconds (default: 30000)',
|
|
65
|
+
},
|
|
45
66
|
{
|
|
46
67
|
name: '-w, --watch',
|
|
47
68
|
description: 'Watch for changes and re-index automatically',
|
|
@@ -52,7 +73,8 @@ export const helpContent: Record<string, CommandHelp> = {
|
|
|
52
73
|
],
|
|
53
74
|
notes: [
|
|
54
75
|
'After indexing, prompts to enable semantic search (use --no-embed to skip).',
|
|
55
|
-
'
|
|
76
|
+
'Providers: openai (default), ollama (free/local), lm-studio, openrouter, voyage.',
|
|
77
|
+
'Set API keys: OPENAI_API_KEY, OPENROUTER_API_KEY, or use local providers.',
|
|
56
78
|
'Index is stored in .mdcontext/ directory.',
|
|
57
79
|
],
|
|
58
80
|
},
|
|
@@ -76,6 +98,21 @@ export const helpContent: Record<string, CommandHelp> = {
|
|
|
76
98
|
'# Context lines (like grep):',
|
|
77
99
|
'mdcontext search "checkpoint" -C 3 # 3 lines before AND after',
|
|
78
100
|
'mdcontext search "error" -B 2 -A 5 # 2 before, 5 after',
|
|
101
|
+
'',
|
|
102
|
+
'# Quality modes (speed vs recall tradeoff):',
|
|
103
|
+
'mdcontext search "auth" --quality fast # Faster, slight recall reduction',
|
|
104
|
+
'mdcontext search "auth" -q thorough # Best recall, ~30% slower',
|
|
105
|
+
'',
|
|
106
|
+
'# Re-ranking for precision:',
|
|
107
|
+
'mdcontext search "auth" --rerank # Re-rank with cross-encoder',
|
|
108
|
+
'',
|
|
109
|
+
'# HyDE for complex queries:',
|
|
110
|
+
'mdcontext search "how to implement auth" --hyde # Expands query semantically',
|
|
111
|
+
'',
|
|
112
|
+
'# AI summarization:',
|
|
113
|
+
'mdcontext search "auth" --summarize # Get AI summary of results',
|
|
114
|
+
'mdcontext search "error" -s --yes # Skip cost confirmation',
|
|
115
|
+
'mdcontext search "config" -s --stream # Stream summary output',
|
|
79
116
|
],
|
|
80
117
|
options: [
|
|
81
118
|
{
|
|
@@ -88,7 +125,7 @@ export const helpContent: Record<string, CommandHelp> = {
|
|
|
88
125
|
},
|
|
89
126
|
{
|
|
90
127
|
name: '-m, --mode <mode>',
|
|
91
|
-
description: 'Force search mode: semantic or
|
|
128
|
+
description: 'Force search mode: semantic, keyword, or hybrid',
|
|
92
129
|
},
|
|
93
130
|
{
|
|
94
131
|
name: '-n, --limit <n>',
|
|
@@ -109,10 +146,50 @@ export const helpContent: Record<string, CommandHelp> = {
|
|
|
109
146
|
{
|
|
110
147
|
name: '--threshold <n>',
|
|
111
148
|
description:
|
|
112
|
-
'Similarity threshold 0-1 for semantic search (default: 0.
|
|
149
|
+
'Similarity threshold 0-1 for semantic search (default: 0.35)',
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
name: '--provider <name>',
|
|
153
|
+
description: 'Embedding provider for semantic search',
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
name: '--timeout <ms>',
|
|
157
|
+
description: 'Embedding API timeout in milliseconds (default: 30000)',
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
name: '-r, --rerank',
|
|
161
|
+
description:
|
|
162
|
+
'Re-rank results with cross-encoder for better precision. Downloads ~90MB model on first use.',
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
name: '--rerank-init',
|
|
166
|
+
description:
|
|
167
|
+
'Pre-download cross-encoder model (~90MB) before first search to avoid latency.',
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
name: '-q, --quality <mode>',
|
|
171
|
+
description:
|
|
172
|
+
'Search quality: fast (quicker), balanced (default), thorough (best recall)',
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
name: '--hyde',
|
|
176
|
+
description:
|
|
177
|
+
'Use HyDE query expansion for complex queries. Improves recall 10-30% at cost of ~1-2s latency.',
|
|
113
178
|
},
|
|
114
179
|
{ name: '--json', description: 'Output results as JSON' },
|
|
115
180
|
{ name: '--pretty', description: 'Pretty-print JSON output' },
|
|
181
|
+
{
|
|
182
|
+
name: '-s, --summarize',
|
|
183
|
+
description: 'Generate AI summary of search results',
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
name: '-y, --yes',
|
|
187
|
+
description: 'Skip cost confirmation for paid AI providers',
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
name: '--stream',
|
|
191
|
+
description: 'Stream AI summary output in real-time',
|
|
192
|
+
},
|
|
116
193
|
],
|
|
117
194
|
notes: [
|
|
118
195
|
'Auto-detects mode: semantic if embeddings exist, keyword otherwise.',
|
|
@@ -120,6 +197,29 @@ export const helpContent: Record<string, CommandHelp> = {
|
|
|
120
197
|
'Quoted phrases match exactly: "context resumption".',
|
|
121
198
|
'Regex patterns (e.g., "API.*") always use keyword search.',
|
|
122
199
|
'Run "mdcontext index --embed" first for semantic search.',
|
|
200
|
+
'',
|
|
201
|
+
'Similarity threshold (--threshold):',
|
|
202
|
+
' Default: 0.35 (35%). Results below this similarity are filtered out.',
|
|
203
|
+
' If 0 results: content may exist below threshold. Try --threshold 0.25.',
|
|
204
|
+
' Typical scores: single words ~30-40%, phrases ~50-70%.',
|
|
205
|
+
' Higher threshold = stricter matching. Lower = more results.',
|
|
206
|
+
'',
|
|
207
|
+
'Re-ranking (--rerank):',
|
|
208
|
+
' Cross-encoder model improves precision by 20-35%.',
|
|
209
|
+
' Requires: npm install @huggingface/transformers',
|
|
210
|
+
' Model is downloaded on first use (~90MB) and cached locally.',
|
|
211
|
+
' Use --rerank-init to pre-download and avoid latency on first search.',
|
|
212
|
+
'',
|
|
213
|
+
'Quality modes (--quality):',
|
|
214
|
+
' fast: efSearch=64, ~40% faster, slight recall reduction.',
|
|
215
|
+
' balanced: efSearch=100 (default), good balance of speed and recall.',
|
|
216
|
+
' thorough: efSearch=256, ~30% slower, best recall for large corpora.',
|
|
217
|
+
'',
|
|
218
|
+
'HyDE (--hyde):',
|
|
219
|
+
' Generates hypothetical document using LLM, searches with that embedding.',
|
|
220
|
+
' Best for: "how to" questions, complex queries, ambiguous searches.',
|
|
221
|
+
' Requires: OPENAI_API_KEY (uses gpt-4o-mini by default).',
|
|
222
|
+
' Adds ~1-2s latency, improves recall 10-30% on complex queries.',
|
|
123
223
|
],
|
|
124
224
|
},
|
|
125
225
|
context: {
|
|
@@ -139,6 +239,10 @@ export const helpContent: Record<string, CommandHelp> = {
|
|
|
139
239
|
'mdcontext context doc.md --section "2.1" # Extract by section number',
|
|
140
240
|
'mdcontext context doc.md --section "API*" # Glob pattern matching',
|
|
141
241
|
'mdcontext context doc.md --section "Config" --shallow # Top-level only',
|
|
242
|
+
'',
|
|
243
|
+
'# Section exclusion:',
|
|
244
|
+
'mdcontext context doc.md --exclude "License" # Exclude License section',
|
|
245
|
+
'mdcontext context doc.md -x "License" -x "Test*" # Multiple exclusions',
|
|
142
246
|
],
|
|
143
247
|
options: [
|
|
144
248
|
{
|
|
@@ -166,6 +270,10 @@ export const helpContent: Record<string, CommandHelp> = {
|
|
|
166
270
|
name: '--shallow',
|
|
167
271
|
description: 'Exclude nested subsections when using --section',
|
|
168
272
|
},
|
|
273
|
+
{
|
|
274
|
+
name: '-x, --exclude <pattern>',
|
|
275
|
+
description: 'Exclude sections by name, number, or glob (repeatable)',
|
|
276
|
+
},
|
|
169
277
|
{ name: '--json', description: 'Output as JSON' },
|
|
170
278
|
{ name: '--pretty', description: 'Pretty-print JSON output' },
|
|
171
279
|
],
|
|
@@ -174,6 +282,7 @@ export const helpContent: Record<string, CommandHelp> = {
|
|
|
174
282
|
'Lower tokens = more aggressive summarization.',
|
|
175
283
|
'Output is formatted for direct use in LLM prompts.',
|
|
176
284
|
'Use --sections to discover section names before filtering.',
|
|
285
|
+
'Exclusion: -x matches by heading name, section number, or glob pattern.',
|
|
177
286
|
],
|
|
178
287
|
},
|
|
179
288
|
tree: {
|
|
@@ -243,6 +352,66 @@ export const helpContent: Record<string, CommandHelp> = {
|
|
|
243
352
|
],
|
|
244
353
|
notes: ['Shows embedding count, dimensions, and cost if embeddings exist.'],
|
|
245
354
|
},
|
|
355
|
+
config: {
|
|
356
|
+
description: 'Configuration management',
|
|
357
|
+
usage: 'mdcontext config <command> [options]',
|
|
358
|
+
examples: [
|
|
359
|
+
'mdcontext config init # Create a starter config file',
|
|
360
|
+
'mdcontext config init --format json # Create JSON config instead of JS',
|
|
361
|
+
'mdcontext config show # Show config file location',
|
|
362
|
+
'mdcontext config check # Validate and show effective config',
|
|
363
|
+
'mdcontext config check --json # Output config as JSON',
|
|
364
|
+
],
|
|
365
|
+
options: [
|
|
366
|
+
{ name: 'init', description: 'Create a starter config file' },
|
|
367
|
+
{ name: 'show', description: 'Display config file location' },
|
|
368
|
+
{
|
|
369
|
+
name: 'check',
|
|
370
|
+
description: 'Validate and show effective configuration',
|
|
371
|
+
},
|
|
372
|
+
{
|
|
373
|
+
name: '-f, --format <format>',
|
|
374
|
+
description: 'Config format: js or json (init only)',
|
|
375
|
+
},
|
|
376
|
+
{ name: '--force', description: 'Overwrite existing config (init only)' },
|
|
377
|
+
{ name: '--json', description: 'Output as JSON' },
|
|
378
|
+
{ name: '--pretty', description: 'Pretty-print JSON output' },
|
|
379
|
+
],
|
|
380
|
+
notes: [
|
|
381
|
+
'Config files set persistent defaults for all commands.',
|
|
382
|
+
'Precedence: CLI flags > environment > config file > defaults.',
|
|
383
|
+
'See docs/CONFIG.md for full configuration reference.',
|
|
384
|
+
],
|
|
385
|
+
},
|
|
386
|
+
embeddings: {
|
|
387
|
+
description: 'Manage embedding namespaces',
|
|
388
|
+
usage: 'mdcontext embeddings <command> [options]',
|
|
389
|
+
examples: [
|
|
390
|
+
'mdcontext embeddings list # List all embedding namespaces',
|
|
391
|
+
'mdcontext embeddings current # Show active namespace',
|
|
392
|
+
'mdcontext embeddings switch openai # Switch to OpenAI embeddings',
|
|
393
|
+
'mdcontext embeddings switch voyage # Switch to Voyage embeddings',
|
|
394
|
+
'mdcontext embeddings remove ollama # Remove Ollama embeddings',
|
|
395
|
+
'mdcontext embeddings remove openai -f # Force remove active namespace',
|
|
396
|
+
],
|
|
397
|
+
options: [
|
|
398
|
+
{ name: 'list', description: 'List all available embedding namespaces' },
|
|
399
|
+
{ name: 'current', description: 'Show the current active namespace' },
|
|
400
|
+
{
|
|
401
|
+
name: 'switch <namespace>',
|
|
402
|
+
description: 'Switch to a different namespace',
|
|
403
|
+
},
|
|
404
|
+
{ name: 'remove <namespace>', description: 'Remove a namespace' },
|
|
405
|
+
{ name: '-f, --force', description: 'Force remove active namespace' },
|
|
406
|
+
{ name: '--json', description: 'Output as JSON' },
|
|
407
|
+
{ name: '--pretty', description: 'Pretty-print JSON output' },
|
|
408
|
+
],
|
|
409
|
+
notes: [
|
|
410
|
+
'Namespaces store embeddings separately by provider/model.',
|
|
411
|
+
'Switching namespaces is instant - no rebuild required.',
|
|
412
|
+
'Run "mdcontext index --embed" to create embeddings for a provider.',
|
|
413
|
+
],
|
|
414
|
+
},
|
|
246
415
|
}
|
|
247
416
|
|
|
248
417
|
// ============================================================================
|
|
@@ -304,6 +473,8 @@ export const showMainHelp = (): void => {
|
|
|
304
473
|
search <query> [path] Search by meaning or structure
|
|
305
474
|
context <files>... Get LLM-ready summary
|
|
306
475
|
tree [path] Show files or document outline
|
|
476
|
+
config <command> Configuration management
|
|
477
|
+
embeddings <command> Manage embedding namespaces
|
|
307
478
|
links <file> Show outgoing links
|
|
308
479
|
backlinks <file> Show incoming links
|
|
309
480
|
stats [path] Index statistics
|
|
@@ -337,11 +508,15 @@ export const showMainHelp = (): void => {
|
|
|
337
508
|
\x1b[2m# Build semantic search\x1b[0m
|
|
338
509
|
mdcontext index --embed && mdcontext search "authentication flow"
|
|
339
510
|
|
|
511
|
+
\x1b[2m# Set up project configuration\x1b[0m
|
|
512
|
+
mdcontext config init && mdcontext config check
|
|
513
|
+
|
|
340
514
|
\x1b[33mGLOBAL OPTIONS\x1b[0m
|
|
341
|
-
--
|
|
342
|
-
--
|
|
343
|
-
--
|
|
344
|
-
--
|
|
515
|
+
-c, --config <file> Use specified config file
|
|
516
|
+
--json Output as JSON
|
|
517
|
+
--pretty Pretty-print JSON
|
|
518
|
+
--help, -h Show help
|
|
519
|
+
--version, -v Show version
|
|
345
520
|
|
|
346
521
|
Run \x1b[36mmdcontext <command> --help\x1b[0m for command-specific options.
|
|
347
522
|
`
|
|
@@ -371,6 +546,33 @@ export const checkSubcommandHelp = (): boolean => {
|
|
|
371
546
|
return false
|
|
372
547
|
}
|
|
373
548
|
|
|
549
|
+
/**
|
|
550
|
+
* Check for bare subcommand that has nested subcommands (e.g., "config", "embeddings").
|
|
551
|
+
* Shows custom help when running "mdcontext config" without arguments.
|
|
552
|
+
* This prevents the ugly Effect CLI default output.
|
|
553
|
+
*/
|
|
554
|
+
export const checkBareSubcommandHelp = (): boolean => {
|
|
555
|
+
const args = process.argv.slice(2)
|
|
556
|
+
|
|
557
|
+
// Look for: exactly one arg that is a command with subcommands in helpContent
|
|
558
|
+
if (args.length !== 1) return false
|
|
559
|
+
|
|
560
|
+
const command = args[0]
|
|
561
|
+
|
|
562
|
+
// Only handle commands that have subcommands and custom help
|
|
563
|
+
const commandsWithSubcommands = ['config', 'embeddings']
|
|
564
|
+
if (
|
|
565
|
+
command &&
|
|
566
|
+
commandsWithSubcommands.includes(command) &&
|
|
567
|
+
helpContent[command]
|
|
568
|
+
) {
|
|
569
|
+
showSubcommandHelp(command)
|
|
570
|
+
process.exit(0)
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
return false
|
|
574
|
+
}
|
|
575
|
+
|
|
374
576
|
/**
|
|
375
577
|
* Check if we should show main help
|
|
376
578
|
*/
|