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.
Files changed (251) hide show
  1. package/.changeset/config.json +9 -9
  2. package/.claude/settings.local.json +25 -0
  3. package/.github/workflows/claude-code-review.yml +44 -0
  4. package/.github/workflows/claude.yml +85 -0
  5. package/CONTRIBUTING.md +186 -0
  6. package/NOTES/NOTES +44 -0
  7. package/README.md +206 -3
  8. package/biome.json +1 -1
  9. package/dist/chunk-23UPXDNL.js +3044 -0
  10. package/dist/chunk-2W7MO2DL.js +1366 -0
  11. package/dist/chunk-3NUAZGMA.js +1689 -0
  12. package/dist/chunk-7TOWB2XB.js +366 -0
  13. package/dist/chunk-7XOTOADQ.js +3065 -0
  14. package/dist/chunk-AH2PDM2K.js +3042 -0
  15. package/dist/chunk-BNXWSZ63.js +3742 -0
  16. package/dist/chunk-BTL5DJVU.js +3222 -0
  17. package/dist/chunk-HDHYG7E4.js +104 -0
  18. package/dist/chunk-HLR4KZBP.js +3234 -0
  19. package/dist/chunk-IP3FRFEB.js +1045 -0
  20. package/dist/chunk-KHU56VDO.js +3042 -0
  21. package/dist/chunk-KRYIFLQR.js +85 -89
  22. package/dist/chunk-LBSDNLEM.js +287 -0
  23. package/dist/chunk-MNTQ7HCP.js +2643 -0
  24. package/dist/chunk-MUJELQQ6.js +1387 -0
  25. package/dist/chunk-MXJGMSLV.js +2199 -0
  26. package/dist/chunk-N6QJGC3Z.js +2636 -0
  27. package/dist/chunk-OBELGBPM.js +1713 -0
  28. package/dist/chunk-OT7R5XTA.js +3192 -0
  29. package/dist/chunk-P7X4RA2T.js +106 -0
  30. package/dist/chunk-PIDUQNC2.js +3185 -0
  31. package/dist/chunk-POGCDIH4.js +3187 -0
  32. package/dist/chunk-PSIEOQGZ.js +3043 -0
  33. package/dist/chunk-PVRT3IHA.js +3238 -0
  34. package/dist/chunk-QNN4TT23.js +1430 -0
  35. package/dist/chunk-RE3R45RJ.js +3042 -0
  36. package/dist/chunk-S7E6TFX6.js +718 -657
  37. package/dist/chunk-SG6GLU4U.js +1378 -0
  38. package/dist/chunk-SJCDV2ST.js +274 -0
  39. package/dist/chunk-SYE5XLF3.js +104 -0
  40. package/dist/chunk-T5VLYBZD.js +103 -0
  41. package/dist/chunk-TOQB7VWU.js +3238 -0
  42. package/dist/chunk-VFNMZ4ZQ.js +3228 -0
  43. package/dist/chunk-VVTGZNBT.js +1533 -1423
  44. package/dist/chunk-W7Q4RFEV.js +104 -0
  45. package/dist/chunk-XTYYVRLO.js +3190 -0
  46. package/dist/chunk-Y6MDYVJD.js +3063 -0
  47. package/dist/cli/main.js +4072 -629
  48. package/dist/index.d.ts +420 -33
  49. package/dist/index.js +8 -15
  50. package/dist/mcp/server.js +103 -7
  51. package/dist/schema-BAWSG7KY.js +22 -0
  52. package/dist/schema-E3QUPL26.js +20 -0
  53. package/dist/schema-EHL7WUT6.js +20 -0
  54. package/docs/019-USAGE.md +44 -5
  55. package/docs/020-current-implementation.md +8 -8
  56. package/docs/021-DOGFOODING-FINDINGS.md +1 -1
  57. package/docs/CONFIG.md +1123 -0
  58. package/docs/ERRORS.md +383 -0
  59. package/docs/summarization.md +320 -0
  60. package/justfile +40 -0
  61. package/package.json +39 -33
  62. package/research/INDEX.md +315 -0
  63. package/research/code-review/README.md +90 -0
  64. package/research/code-review/cli-error-handling-review.md +979 -0
  65. package/research/code-review/code-review-validation-report.md +464 -0
  66. package/research/code-review/main-ts-review.md +1128 -0
  67. package/research/config-docs/SUMMARY.md +357 -0
  68. package/research/config-docs/TEST-RESULTS.md +776 -0
  69. package/research/config-docs/TODO.md +542 -0
  70. package/research/config-docs/analysis.md +744 -0
  71. package/research/config-docs/fix-validation.md +502 -0
  72. package/research/config-docs/help-audit.md +264 -0
  73. package/research/config-docs/help-system-analysis.md +890 -0
  74. package/research/frontmatter/COMMENTS-ARE-SKIPPED.md +149 -0
  75. package/research/frontmatter/LLM-CODE-NAVIGATION.md +276 -0
  76. package/research/issue-review.md +603 -0
  77. package/research/llm-summarization/agent-cli-tools-2026.md +1082 -0
  78. package/research/llm-summarization/alternative-providers-2026.md +1428 -0
  79. package/research/llm-summarization/anthropic-2026.md +367 -0
  80. package/research/llm-summarization/claude-cli-integration.md +1706 -0
  81. package/research/llm-summarization/cli-integration-patterns.md +3155 -0
  82. package/research/llm-summarization/openai-2026.md +473 -0
  83. package/research/llm-summarization/openai-compatible-providers-2026.md +1022 -0
  84. package/research/llm-summarization/opencode-cli-integration.md +1552 -0
  85. package/research/llm-summarization/prompt-engineering-2026.md +1426 -0
  86. package/research/llm-summarization/prototype-results.md +56 -0
  87. package/research/llm-summarization/provider-switching-patterns-2026.md +2153 -0
  88. package/research/llm-summarization/typescript-llm-libraries-2026.md +2436 -0
  89. package/research/mdcontext-pudding/00-EXECUTIVE-SUMMARY.md +282 -0
  90. package/research/mdcontext-pudding/01-index-embed.md +956 -0
  91. package/research/mdcontext-pudding/02-search-COMMANDS.md +142 -0
  92. package/research/mdcontext-pudding/02-search-SUMMARY.md +146 -0
  93. package/research/mdcontext-pudding/02-search.md +970 -0
  94. package/research/mdcontext-pudding/03-context.md +779 -0
  95. package/research/mdcontext-pudding/04-navigation-and-analytics.md +803 -0
  96. package/research/mdcontext-pudding/04-tree.md +704 -0
  97. package/research/mdcontext-pudding/05-config.md +1038 -0
  98. package/research/mdcontext-pudding/06-links-summary.txt +87 -0
  99. package/research/mdcontext-pudding/06-links.md +679 -0
  100. package/research/mdcontext-pudding/07-stats.md +693 -0
  101. package/research/mdcontext-pudding/BUG-FIX-PLAN.md +388 -0
  102. package/research/mdcontext-pudding/P0-BUG-VALIDATION.md +167 -0
  103. package/research/mdcontext-pudding/README.md +168 -0
  104. package/research/mdcontext-pudding/TESTING-SUMMARY.md +128 -0
  105. package/research/research-quality-review.md +834 -0
  106. package/research/semantic-search/embedding-text-analysis.md +156 -0
  107. package/research/semantic-search/multi-word-failure-reproduction.md +171 -0
  108. package/research/semantic-search/query-processing-analysis.md +207 -0
  109. package/research/semantic-search/root-cause-and-solution.md +114 -0
  110. package/research/semantic-search/threshold-validation-report.md +69 -0
  111. package/research/semantic-search/vector-search-analysis.md +63 -0
  112. package/research/test-path-issues.md +276 -0
  113. package/review/ALP-76/1-error-type-design.md +962 -0
  114. package/review/ALP-76/2-error-handling-patterns.md +906 -0
  115. package/review/ALP-76/3-error-presentation.md +624 -0
  116. package/review/ALP-76/4-test-coverage.md +625 -0
  117. package/review/ALP-76/5-migration-completeness.md +440 -0
  118. package/review/ALP-76/6-effect-best-practices.md +755 -0
  119. package/scripts/apply-branch-protection.sh +47 -0
  120. package/scripts/branch-protection-templates.json +79 -0
  121. package/scripts/prototype-summarization.ts +346 -0
  122. package/scripts/rebuild-hnswlib.js +32 -37
  123. package/scripts/setup-branch-protection.sh +64 -0
  124. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/active-provider.json +7 -0
  125. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/bm25.json +541 -0
  126. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/bm25.meta.json +5 -0
  127. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/config.json +8 -0
  128. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.bin +0 -0
  129. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.meta.bin +0 -0
  130. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/indexes/documents.json +60 -0
  131. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/indexes/links.json +13 -0
  132. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/indexes/sections.json +1197 -0
  133. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/configuration-management.md +99 -0
  134. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/distributed-systems.md +92 -0
  135. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/error-handling.md +78 -0
  136. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/failure-automation.md +55 -0
  137. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/job-context.md +69 -0
  138. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/process-orchestration.md +99 -0
  139. package/src/cli/argv-preprocessor.test.ts +2 -2
  140. package/src/cli/cli.test.ts +230 -33
  141. package/src/cli/commands/config-cmd.ts +642 -0
  142. package/src/cli/commands/context.ts +97 -9
  143. package/src/cli/commands/duplicates.ts +122 -0
  144. package/src/cli/commands/embeddings.ts +529 -0
  145. package/src/cli/commands/index-cmd.ts +210 -30
  146. package/src/cli/commands/index.ts +3 -0
  147. package/src/cli/commands/search.ts +894 -64
  148. package/src/cli/commands/stats.ts +3 -0
  149. package/src/cli/commands/tree.ts +26 -5
  150. package/src/cli/config-layer.ts +176 -0
  151. package/src/cli/error-handler.test.ts +235 -0
  152. package/src/cli/error-handler.ts +655 -0
  153. package/src/cli/flag-schemas.ts +66 -0
  154. package/src/cli/help.ts +209 -7
  155. package/src/cli/main.ts +348 -58
  156. package/src/cli/options.ts +10 -0
  157. package/src/cli/shared-error-handling.ts +199 -0
  158. package/src/cli/utils.ts +150 -17
  159. package/src/config/file-provider.test.ts +320 -0
  160. package/src/config/file-provider.ts +273 -0
  161. package/src/config/index.ts +72 -0
  162. package/src/config/integration.test.ts +667 -0
  163. package/src/config/precedence.test.ts +277 -0
  164. package/src/config/precedence.ts +451 -0
  165. package/src/config/schema.test.ts +414 -0
  166. package/src/config/schema.ts +603 -0
  167. package/src/config/service.test.ts +320 -0
  168. package/src/config/service.ts +243 -0
  169. package/src/config/testing.test.ts +264 -0
  170. package/src/config/testing.ts +110 -0
  171. package/src/core/types.ts +6 -33
  172. package/src/duplicates/detector.test.ts +183 -0
  173. package/src/duplicates/detector.ts +414 -0
  174. package/src/duplicates/index.ts +18 -0
  175. package/src/embeddings/embedding-namespace.test.ts +300 -0
  176. package/src/embeddings/embedding-namespace.ts +947 -0
  177. package/src/embeddings/heading-boost.test.ts +222 -0
  178. package/src/embeddings/hnsw-build-options.test.ts +198 -0
  179. package/src/embeddings/hyde.test.ts +272 -0
  180. package/src/embeddings/hyde.ts +264 -0
  181. package/src/embeddings/index.ts +2 -0
  182. package/src/embeddings/openai-provider.ts +332 -83
  183. package/src/embeddings/pricing.json +22 -0
  184. package/src/embeddings/provider-constants.ts +204 -0
  185. package/src/embeddings/provider-errors.test.ts +967 -0
  186. package/src/embeddings/provider-errors.ts +565 -0
  187. package/src/embeddings/provider-factory.test.ts +240 -0
  188. package/src/embeddings/provider-factory.ts +225 -0
  189. package/src/embeddings/provider-integration.test.ts +788 -0
  190. package/src/embeddings/query-preprocessing.test.ts +187 -0
  191. package/src/embeddings/semantic-search-threshold.test.ts +508 -0
  192. package/src/embeddings/semantic-search.ts +780 -93
  193. package/src/embeddings/types.ts +293 -16
  194. package/src/embeddings/vector-store.ts +486 -77
  195. package/src/embeddings/voyage-provider.ts +313 -0
  196. package/src/errors/errors.test.ts +845 -0
  197. package/src/errors/index.ts +533 -0
  198. package/src/index/ignore-patterns.test.ts +354 -0
  199. package/src/index/ignore-patterns.ts +305 -0
  200. package/src/index/indexer.ts +286 -48
  201. package/src/index/storage.ts +94 -30
  202. package/src/index/types.ts +40 -2
  203. package/src/index/watcher.ts +67 -9
  204. package/src/index.ts +22 -0
  205. package/src/integration/search-keyword.test.ts +678 -0
  206. package/src/mcp/server.ts +135 -6
  207. package/src/parser/parser.ts +18 -19
  208. package/src/parser/section-filter.test.ts +277 -0
  209. package/src/parser/section-filter.ts +125 -3
  210. package/src/search/__tests__/hybrid-search.test.ts +650 -0
  211. package/src/search/bm25-store.ts +366 -0
  212. package/src/search/cross-encoder.test.ts +253 -0
  213. package/src/search/cross-encoder.ts +406 -0
  214. package/src/search/fuzzy-search.test.ts +419 -0
  215. package/src/search/fuzzy-search.ts +273 -0
  216. package/src/search/hybrid-search.ts +448 -0
  217. package/src/search/path-matcher.test.ts +276 -0
  218. package/src/search/path-matcher.ts +33 -0
  219. package/src/search/searcher.test.ts +99 -1
  220. package/src/search/searcher.ts +189 -67
  221. package/src/search/wink-bm25.d.ts +30 -0
  222. package/src/summarization/cli-providers/claude.ts +202 -0
  223. package/src/summarization/cli-providers/detection.test.ts +273 -0
  224. package/src/summarization/cli-providers/detection.ts +118 -0
  225. package/src/summarization/cli-providers/index.ts +8 -0
  226. package/src/summarization/cost.test.ts +139 -0
  227. package/src/summarization/cost.ts +102 -0
  228. package/src/summarization/error-handler.test.ts +127 -0
  229. package/src/summarization/error-handler.ts +111 -0
  230. package/src/summarization/index.ts +102 -0
  231. package/src/summarization/pipeline.test.ts +498 -0
  232. package/src/summarization/pipeline.ts +231 -0
  233. package/src/summarization/prompts.test.ts +269 -0
  234. package/src/summarization/prompts.ts +133 -0
  235. package/src/summarization/provider-factory.test.ts +396 -0
  236. package/src/summarization/provider-factory.ts +178 -0
  237. package/src/summarization/types.ts +184 -0
  238. package/src/summarize/summarizer.ts +104 -35
  239. package/src/types/huggingface-transformers.d.ts +66 -0
  240. package/tests/fixtures/cli/.mdcontext/active-provider.json +7 -0
  241. package/tests/fixtures/cli/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.bin +0 -0
  242. package/tests/fixtures/cli/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.meta.bin +0 -0
  243. package/tests/fixtures/cli/.mdcontext/indexes/documents.json +4 -4
  244. package/tests/fixtures/cli/.mdcontext/indexes/sections.json +14 -0
  245. package/tests/integration/embed-index.test.ts +712 -0
  246. package/tests/integration/search-context.test.ts +469 -0
  247. package/tests/integration/search-semantic.test.ts +522 -0
  248. package/vitest.config.ts +1 -6
  249. package/AGENTS.md +0 -46
  250. package/tests/fixtures/cli/.mdcontext/vectors.bin +0 -0
  251. package/tests/fixtures/cli/.mdcontext/vectors.meta.json +0 -1264
@@ -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
- 'Embedding requires OPENAI_API_KEY environment variable.',
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 keyword',
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.5)',
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
- --json Output as JSON
342
- --pretty Pretty-print JSON
343
- --help, -h Show help
344
- --version, -v Show version
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
  */