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
@@ -4,13 +4,17 @@ import {
4
4
  search,
5
5
  semanticSearch,
6
6
  summarizeFile
7
- } from "../chunk-VVTGZNBT.js";
7
+ } from "../chunk-BNXWSZ63.js";
8
8
  import {
9
9
  buildIndex,
10
+ getIncomingLinks,
11
+ getOutgoingLinks,
10
12
  parseFile
11
- } from "../chunk-S7E6TFX6.js";
13
+ } from "../chunk-MUJELQQ6.js";
14
+ import "../chunk-7TOWB2XB.js";
12
15
 
13
16
  // src/mcp/server.ts
17
+ import { createRequire } from "module";
14
18
  import * as path from "path";
15
19
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
16
20
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
@@ -19,6 +23,9 @@ import {
19
23
  ListToolsRequestSchema
20
24
  } from "@modelcontextprotocol/sdk/types.js";
21
25
  import { Effect } from "effect";
26
+ var require2 = createRequire(import.meta.url);
27
+ var packageJson = require2("../../package.json");
28
+ var MCP_VERSION = packageJson.version;
22
29
  var tools = [
23
30
  {
24
31
  name: "md_search",
@@ -41,8 +48,8 @@ var tools = [
41
48
  },
42
49
  threshold: {
43
50
  type: "number",
44
- description: "Minimum similarity threshold 0-1 (default: 0.5)",
45
- default: 0.5
51
+ description: "Minimum similarity threshold 0-1 (default: 0.35)",
52
+ default: 0.35
46
53
  }
47
54
  },
48
55
  required: ["query"]
@@ -138,13 +145,41 @@ var tools = [
138
145
  }
139
146
  }
140
147
  }
148
+ },
149
+ {
150
+ name: "md_links",
151
+ description: "Get outgoing links from a markdown file. Shows what files this document references/links to.",
152
+ inputSchema: {
153
+ type: "object",
154
+ properties: {
155
+ path: {
156
+ type: "string",
157
+ description: "Path to the markdown file"
158
+ }
159
+ },
160
+ required: ["path"]
161
+ }
162
+ },
163
+ {
164
+ name: "md_backlinks",
165
+ description: "Get incoming links to a markdown file. Shows what files reference/link to this document.",
166
+ inputSchema: {
167
+ type: "object",
168
+ properties: {
169
+ path: {
170
+ type: "string",
171
+ description: "Path to the markdown file"
172
+ }
173
+ },
174
+ required: ["path"]
175
+ }
141
176
  }
142
177
  ];
143
178
  var handleMdSearch = async (args, rootPath) => {
144
179
  const query = args.query;
145
180
  const limit = args.limit ?? 5;
146
181
  const pathFilter = args.path_filter;
147
- const threshold = args.threshold ?? 0.5;
182
+ const threshold = args.threshold ?? 0.35;
148
183
  const result = await Effect.runPromise(
149
184
  semanticSearch(rootPath, query, {
150
185
  limit,
@@ -206,7 +241,6 @@ var handleMdStructure = async (args, rootPath) => {
206
241
  const resolvedPath = path.isAbsolute(filePath) ? filePath : path.join(rootPath, filePath);
207
242
  const result = await Effect.runPromise(
208
243
  parseFile(resolvedPath).pipe(
209
- Effect.mapError((e) => new Error(`${e._tag}: ${e.message}`)),
210
244
  Effect.catchAll((e) => Effect.succeed({ error: e.message }))
211
245
  )
212
246
  );
@@ -319,11 +353,69 @@ var handleMdIndex = async (args, rootPath) => {
319
353
  ]
320
354
  };
321
355
  };
356
+ var handleMdLinks = async (args, rootPath) => {
357
+ const filePath = args.path;
358
+ const resolvedPath = path.isAbsolute(filePath) ? filePath : path.join(rootPath, filePath);
359
+ const result = await Effect.runPromise(
360
+ getOutgoingLinks(rootPath, resolvedPath).pipe(
361
+ Effect.catchAll((e) => Effect.succeed({ error: e.message }))
362
+ )
363
+ );
364
+ if ("error" in result) {
365
+ return {
366
+ content: [{ type: "text", text: `Error: ${result.error}` }],
367
+ isError: true
368
+ };
369
+ }
370
+ const links = result;
371
+ const relativePath = path.relative(rootPath, resolvedPath);
372
+ return {
373
+ content: [
374
+ {
375
+ type: "text",
376
+ text: links.length > 0 ? `Outgoing links from ${relativePath}:
377
+
378
+ ${links.map((l) => ` -> ${l}`).join("\n")}
379
+
380
+ Total: ${links.length} links` : `No outgoing links from ${relativePath}`
381
+ }
382
+ ]
383
+ };
384
+ };
385
+ var handleMdBacklinks = async (args, rootPath) => {
386
+ const filePath = args.path;
387
+ const resolvedPath = path.isAbsolute(filePath) ? filePath : path.join(rootPath, filePath);
388
+ const result = await Effect.runPromise(
389
+ getIncomingLinks(rootPath, resolvedPath).pipe(
390
+ Effect.catchAll((e) => Effect.succeed({ error: e.message }))
391
+ )
392
+ );
393
+ if ("error" in result) {
394
+ return {
395
+ content: [{ type: "text", text: `Error: ${result.error}` }],
396
+ isError: true
397
+ };
398
+ }
399
+ const links = result;
400
+ const relativePath = path.relative(rootPath, resolvedPath);
401
+ return {
402
+ content: [
403
+ {
404
+ type: "text",
405
+ text: links.length > 0 ? `Incoming links to ${relativePath}:
406
+
407
+ ${links.map((l) => ` <- ${l}`).join("\n")}
408
+
409
+ Total: ${links.length} backlinks` : `No incoming links to ${relativePath}`
410
+ }
411
+ ]
412
+ };
413
+ };
322
414
  var createServer = (rootPath) => {
323
415
  const server = new Server(
324
416
  {
325
417
  name: "mdcontext-mcp",
326
- version: "0.1.0"
418
+ version: MCP_VERSION
327
419
  },
328
420
  {
329
421
  capabilities: {
@@ -347,6 +439,10 @@ var createServer = (rootPath) => {
347
439
  return handleMdKeywordSearch(args ?? {}, rootPath);
348
440
  case "md_index":
349
441
  return handleMdIndex(args ?? {}, rootPath);
442
+ case "md_links":
443
+ return handleMdLinks(args ?? {}, rootPath);
444
+ case "md_backlinks":
445
+ return handleMdBacklinks(args ?? {}, rootPath);
350
446
  default:
351
447
  return {
352
448
  content: [{ type: "text", text: `Unknown tool: ${name}` }],
@@ -0,0 +1,22 @@
1
+ import {
2
+ AISummarizationConfig,
3
+ EmbeddingsConfig,
4
+ IndexConfig,
5
+ MdContextConfig,
6
+ OutputConfig,
7
+ PathsConfig,
8
+ SearchConfig,
9
+ SummarizationConfig,
10
+ defaultConfig
11
+ } from "./chunk-7TOWB2XB.js";
12
+ export {
13
+ AISummarizationConfig,
14
+ EmbeddingsConfig,
15
+ IndexConfig,
16
+ MdContextConfig,
17
+ OutputConfig,
18
+ PathsConfig,
19
+ SearchConfig,
20
+ SummarizationConfig,
21
+ defaultConfig
22
+ };
@@ -0,0 +1,20 @@
1
+ import {
2
+ defaultConfig,
3
+ EmbeddingsConfig,
4
+ IndexConfig,
5
+ MdContextConfig,
6
+ OutputConfig,
7
+ PathsConfig,
8
+ SearchConfig,
9
+ SummarizationConfig,
10
+ } from "./chunk-LBSDNLEM.js";
11
+ export {
12
+ EmbeddingsConfig,
13
+ IndexConfig,
14
+ MdContextConfig,
15
+ OutputConfig,
16
+ PathsConfig,
17
+ SearchConfig,
18
+ SummarizationConfig,
19
+ defaultConfig,
20
+ };
@@ -0,0 +1,20 @@
1
+ import {
2
+ defaultConfig,
3
+ EmbeddingsConfig,
4
+ IndexConfig,
5
+ MdContextConfig,
6
+ OutputConfig,
7
+ PathsConfig,
8
+ SearchConfig,
9
+ SummarizationConfig,
10
+ } from "./chunk-SJCDV2ST.js";
11
+ export {
12
+ EmbeddingsConfig,
13
+ IndexConfig,
14
+ MdContextConfig,
15
+ OutputConfig,
16
+ PathsConfig,
17
+ SearchConfig,
18
+ SummarizationConfig,
19
+ defaultConfig,
20
+ };
package/docs/019-USAGE.md CHANGED
@@ -33,7 +33,9 @@ npx mdcontext --help
33
33
  **Requirements:**
34
34
 
35
35
  - Node.js 18+
36
- - OpenAI API key (for semantic search only)
36
+ - Embedding provider for semantic search (see [CONFIG.md](./CONFIG.md) for options):
37
+ - OpenAI or OpenRouter (cloud, requires API key)
38
+ - Ollama or LM Studio (free, local, no API key needed)
37
39
 
38
40
  ---
39
41
 
@@ -51,8 +53,21 @@ mdcontext tree ./docs/README.md # Document outline
51
53
  mdcontext context ./docs/README.md
52
54
 
53
55
  # 4. Enable semantic search (optional)
56
+ # Choose ONE provider:
57
+
58
+ # Option A: OpenAI (cloud, requires API key)
54
59
  export OPENAI_API_KEY=sk-...
55
60
  mdcontext index --embed
61
+
62
+ # Option B: Ollama (free, local, no API key needed)
63
+ ollama serve && ollama pull nomic-embed-text
64
+ mdcontext index --embed --provider ollama --provider-model nomic-embed-text
65
+
66
+ # Option C: LM Studio (free, local, no API key needed)
67
+ # Start LM Studio, load an embedding model, then:
68
+ mdcontext index --embed --provider lm-studio
69
+
70
+ # Then search by meaning:
56
71
  mdcontext search "how to authenticate"
57
72
  ```
58
73
 
@@ -527,6 +542,20 @@ mdcontext context -t 1000 a.md b.md c.md
527
542
 
528
543
  ## Configuration
529
544
 
545
+ mdcontext supports a layered configuration system with files, environment variables, and CLI flags.
546
+
547
+ **Quick start:**
548
+
549
+ ```bash
550
+ # Create a config file
551
+ mdcontext config init
552
+
553
+ # Check current configuration
554
+ mdcontext config check
555
+ ```
556
+
557
+ **For full configuration documentation, see [CONFIG.md](./CONFIG.md).**
558
+
530
559
  ### Index Directory
531
560
 
532
561
  By default, indexes are stored in `.mdcontext/` in your project root:
@@ -544,9 +573,13 @@ By default, indexes are stored in `.mdcontext/` in your project root:
544
573
 
545
574
  ### Environment Variables
546
575
 
547
- | Variable | Required | Description |
548
- | ---------------- | ------------------- | -------------- |
549
- | `OPENAI_API_KEY` | For semantic search | OpenAI API key |
576
+ | Variable | Required | Description |
577
+ | -------------------- | --------------------------- | ------------------------------------ |
578
+ | `OPENAI_API_KEY` | For OpenAI provider | OpenAI API key (cloud provider) |
579
+ | `OPENROUTER_API_KEY` | For OpenRouter provider | OpenRouter API key (cloud provider) |
580
+ | N/A | Ollama / LM Studio | Local providers - no API key needed |
581
+
582
+ All configuration options can also be set via `MDCONTEXT_*` environment variables. See [CONFIG.md](./CONFIG.md#environment-variables) for the complete reference.
550
583
 
551
584
  ### Supported File Types
552
585
 
@@ -571,8 +604,14 @@ Run `mdcontext index` to build the index first.
571
604
 
572
605
  ### "Semantic search not available"
573
606
 
574
- 1. Set `OPENAI_API_KEY` environment variable
607
+ 1. Set up an embedding provider:
608
+ - **OpenAI (cloud):** Set `OPENAI_API_KEY` environment variable
609
+ - **OpenRouter (cloud):** Set `OPENROUTER_API_KEY` environment variable
610
+ - **Ollama (free, local):** Run `ollama serve` (no API key needed)
611
+ - **LM Studio (free, local):** Start the server GUI (no API key needed)
575
612
  2. Run `mdcontext index --embed` to build embedding index
613
+ - For local providers: `mdcontext index --embed --provider ollama`
614
+ 3. See [CONFIG.md](./CONFIG.md) for detailed provider setup
576
615
 
577
616
  ### "File not found in index"
578
617
 
@@ -104,7 +104,7 @@ interface VectorEntry {
104
104
 
105
105
  - HNSW stores cosine distance (1 - similarity)
106
106
  - Search returns `similarity = 1 - distance`
107
- - Results filtered by threshold (default: 0.45)
107
+ - Results filtered by threshold (default: 0.35)
108
108
 
109
109
  ### 3. Semantic Search (`src/embeddings/semantic-search.ts`)
110
110
 
@@ -151,7 +151,7 @@ Document: {documentTitle}
151
151
  - If < 10 seconds: auto-create silently
152
152
  - Otherwise: prompt user for choice
153
153
 
154
- **Default Search Threshold**: 0.45 (raised from 0.3 to filter low-quality matches)
154
+ **Default Search Threshold**: 0.35 (raised from 0.3 to filter low-quality matches)
155
155
 
156
156
  ## Data Flow
157
157
 
@@ -225,7 +225,7 @@ Document: {documentTitle}
225
225
 
226
226
  ┌─────────────────────────────────────────────────────────────────────────┐
227
227
  │ 5. Post-Processing │
228
- │ - Filter by similarity threshold (default: 0.45) │
228
+ │ - Filter by similarity threshold (default: 0.35) │
229
229
  │ - Filter by path pattern (if specified) │
230
230
  │ - Truncate to requested limit │
231
231
  └──────────────────────────────┬──────────────────────────────────────────┘
@@ -249,11 +249,11 @@ Located in `.mdcontext/` directory:
249
249
 
250
250
  ## Current Limitations and Gaps
251
251
 
252
- ### 1. Single Provider Lock-in
252
+ ### 1. ~~Single Provider Lock-in~~ RESOLVED (ALP-215)
253
253
 
254
- - **Issue**: Only OpenAI embeddings supported
255
- - **Impact**: Requires API key, incurs costs, no offline capability
256
- - **Code Location**: `openai-provider.ts` is the only provider implementation
254
+ - **RESOLVED**: Multiple embedding providers now supported (OpenAI, Ollama, LM Studio, OpenRouter)
255
+ - **Impact**: Users can choose local providers for offline capability and cost savings
256
+ - **Code Location**: `provider-factory.ts` handles provider selection based on config
257
257
 
258
258
  ### 2. No Incremental Updates
259
259
 
@@ -347,7 +347,7 @@ efConstruction: 200 // vector-store.ts
347
347
 
348
348
  // Search
349
349
  defaultLimit: 10 // search.ts
350
- defaultThreshold: 0.45 // search.ts
350
+ defaultThreshold: 0.35 // search.ts
351
351
  autoIndexThreshold: 10 seconds // search.ts
352
352
  ```
353
353
 
@@ -67,7 +67,7 @@ mdcontext search "authentication" ./docs
67
67
 
68
68
  **Impact:** Major limitation for discovery. Users searching for concepts/keywords get no results if those words aren't in headings.
69
69
 
70
- **Note:** Full semantic search requires OpenAI API key + `--embed` flag, but structural search should at least search content.
70
+ **Note:** Full semantic search requires an embedding provider (OpenAI, Ollama, LM Studio, or OpenRouter) + `--embed` flag. See [CONFIG.md](./CONFIG.md) for free local options. Structural search should at least search content.
71
71
 
72
72
  ---
73
73