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
@@ -1,92 +1,88 @@
1
- import {
2
- buildIndex,
3
- createStorage,
4
- indexExists
5
- } from "./chunk-S7E6TFX6.js";
6
-
7
- // src/index/watcher.ts
8
- import * as path from "path";
9
1
  import { watch } from "chokidar";
10
2
  import { Effect } from "effect";
11
- var isMarkdownFile = (filePath) => filePath.endsWith(".md") || filePath.endsWith(".mdx");
12
- var watchDirectory = (rootPath, options = {}) => Effect.gen(function* () {
13
- const resolvedRoot = path.resolve(rootPath);
14
- const storage = createStorage(resolvedRoot);
15
- const debounceMs = options.debounceMs ?? 300;
16
- const exists = yield* indexExists(storage);
17
- if (!exists) {
18
- const result = yield* buildIndex(resolvedRoot, options);
19
- options.onIndex?.({
20
- documentsIndexed: result.documentsIndexed,
21
- duration: result.duration
22
- });
23
- }
24
- const pendingPaths = /* @__PURE__ */ new Set();
25
- let debounceTimer = null;
26
- const scheduleReindex = () => {
27
- if (debounceTimer) {
28
- clearTimeout(debounceTimer);
29
- }
30
- debounceTimer = setTimeout(async () => {
31
- if (pendingPaths.size === 0) return;
32
- pendingPaths.clear();
33
- try {
34
- const result = await Effect.runPromise(
35
- buildIndex(resolvedRoot, options)
36
- );
37
- options.onIndex?.({
38
- documentsIndexed: result.documentsIndexed,
39
- duration: result.duration
40
- });
41
- } catch (error) {
42
- options.onError?.(
43
- error instanceof Error ? error : new Error(String(error))
44
- );
45
- }
46
- }, debounceMs);
47
- };
48
- const watcher = watch(resolvedRoot, {
49
- ignored: [
50
- /(^|[/\\])\../,
51
- // Ignore dotfiles
52
- "**/node_modules/**"
53
- ],
54
- persistent: true,
55
- ignoreInitial: true
56
- });
57
- watcher.on("add", (filePath) => {
58
- if (isMarkdownFile(filePath)) {
59
- pendingPaths.add(filePath);
60
- scheduleReindex();
61
- }
62
- });
63
- watcher.on("change", (filePath) => {
64
- if (isMarkdownFile(filePath)) {
65
- pendingPaths.add(filePath);
66
- scheduleReindex();
67
- }
68
- });
69
- watcher.on("unlink", (filePath) => {
70
- if (isMarkdownFile(filePath)) {
71
- pendingPaths.add(filePath);
72
- scheduleReindex();
73
- }
74
- });
75
- watcher.on("error", (error) => {
76
- options.onError?.(
77
- error instanceof Error ? error : new Error(String(error))
78
- );
79
- });
80
- return {
81
- stop: () => {
82
- if (debounceTimer) {
83
- clearTimeout(debounceTimer);
84
- }
85
- watcher.close();
86
- }
87
- };
88
- });
3
+ // src/index/watcher.ts
4
+ import * as path from "path";
5
+ import { buildIndex, createStorage, indexExists } from "./chunk-S7E6TFX6.js";
6
+
7
+ var isMarkdownFile = (filePath) =>
8
+ filePath.endsWith(".md") || filePath.endsWith(".mdx");
9
+ var watchDirectory = (rootPath, options = {}) =>
10
+ Effect.gen(function* () {
11
+ const resolvedRoot = path.resolve(rootPath);
12
+ const storage = createStorage(resolvedRoot);
13
+ const debounceMs = options.debounceMs ?? 300;
14
+ const exists = yield* indexExists(storage);
15
+ if (!exists) {
16
+ const result = yield* buildIndex(resolvedRoot, options);
17
+ options.onIndex?.({
18
+ documentsIndexed: result.documentsIndexed,
19
+ duration: result.duration,
20
+ });
21
+ }
22
+ const pendingPaths = /* @__PURE__ */ new Set();
23
+ let debounceTimer = null;
24
+ const scheduleReindex = () => {
25
+ if (debounceTimer) {
26
+ clearTimeout(debounceTimer);
27
+ }
28
+ debounceTimer = setTimeout(async () => {
29
+ if (pendingPaths.size === 0) return;
30
+ pendingPaths.clear();
31
+ try {
32
+ const result = await Effect.runPromise(
33
+ buildIndex(resolvedRoot, options),
34
+ );
35
+ options.onIndex?.({
36
+ documentsIndexed: result.documentsIndexed,
37
+ duration: result.duration,
38
+ });
39
+ } catch (error) {
40
+ options.onError?.(
41
+ error instanceof Error ? error : new Error(String(error)),
42
+ );
43
+ }
44
+ }, debounceMs);
45
+ };
46
+ const watcher = watch(resolvedRoot, {
47
+ ignored: [
48
+ /(^|[/\\])\../,
49
+ // Ignore dotfiles
50
+ "**/node_modules/**",
51
+ ],
52
+ persistent: true,
53
+ ignoreInitial: true,
54
+ });
55
+ watcher.on("add", (filePath) => {
56
+ if (isMarkdownFile(filePath)) {
57
+ pendingPaths.add(filePath);
58
+ scheduleReindex();
59
+ }
60
+ });
61
+ watcher.on("change", (filePath) => {
62
+ if (isMarkdownFile(filePath)) {
63
+ pendingPaths.add(filePath);
64
+ scheduleReindex();
65
+ }
66
+ });
67
+ watcher.on("unlink", (filePath) => {
68
+ if (isMarkdownFile(filePath)) {
69
+ pendingPaths.add(filePath);
70
+ scheduleReindex();
71
+ }
72
+ });
73
+ watcher.on("error", (error) => {
74
+ options.onError?.(
75
+ error instanceof Error ? error : new Error(String(error)),
76
+ );
77
+ });
78
+ return {
79
+ stop: () => {
80
+ if (debounceTimer) {
81
+ clearTimeout(debounceTimer);
82
+ }
83
+ watcher.close();
84
+ },
85
+ };
86
+ });
89
87
 
90
- export {
91
- watchDirectory
92
- };
88
+ export { watchDirectory };
@@ -0,0 +1,287 @@
1
+ // src/config/schema.ts
2
+ import { Config, Option } from "effect";
3
+
4
+ var IndexConfig = Config.all({
5
+ /**
6
+ * Maximum directory depth to traverse when indexing
7
+ * Default: 10
8
+ */
9
+ maxDepth: Config.number("maxDepth").pipe(Config.withDefault(10)),
10
+ /**
11
+ * Glob patterns to exclude from indexing (comma-separated)
12
+ * Default: ['node_modules', '.git', 'dist', 'build']
13
+ */
14
+ excludePatterns: Config.array(Config.string(), "excludePatterns").pipe(
15
+ Config.withDefault(["node_modules", ".git", "dist", "build"]),
16
+ ),
17
+ /**
18
+ * File extensions to index (comma-separated)
19
+ * Default: ['.md', '.mdx']
20
+ */
21
+ fileExtensions: Config.array(Config.string(), "fileExtensions").pipe(
22
+ Config.withDefault([".md", ".mdx"]),
23
+ ),
24
+ /**
25
+ * Whether to follow symlinks when traversing directories
26
+ * Default: false
27
+ */
28
+ followSymlinks: Config.boolean("followSymlinks").pipe(
29
+ Config.withDefault(false),
30
+ ),
31
+ /**
32
+ * Directory where index files are stored (relative to project root)
33
+ * Default: '.mdcontext'
34
+ */
35
+ indexDir: Config.string("indexDir").pipe(Config.withDefault(".mdcontext")),
36
+ });
37
+ var SearchConfig = Config.all({
38
+ /**
39
+ * Default number of search results to return
40
+ * Default: 10
41
+ */
42
+ defaultLimit: Config.number("defaultLimit").pipe(Config.withDefault(10)),
43
+ /**
44
+ * Maximum number of search results allowed
45
+ * Default: 100
46
+ */
47
+ maxLimit: Config.number("maxLimit").pipe(Config.withDefault(100)),
48
+ /**
49
+ * Minimum similarity score for semantic search results (0-1)
50
+ * Default: 0.5
51
+ */
52
+ minSimilarity: Config.number("minSimilarity").pipe(Config.withDefault(0.5)),
53
+ /**
54
+ * Whether to include content snippets in search results
55
+ * Default: true
56
+ */
57
+ includeSnippets: Config.boolean("includeSnippets").pipe(
58
+ Config.withDefault(true),
59
+ ),
60
+ /**
61
+ * Maximum length of content snippets in characters
62
+ * Default: 200
63
+ */
64
+ snippetLength: Config.number("snippetLength").pipe(Config.withDefault(200)),
65
+ /**
66
+ * Auto-create semantic index if estimated time is under this threshold (seconds)
67
+ * Default: 10
68
+ */
69
+ autoIndexThreshold: Config.number("autoIndexThreshold").pipe(
70
+ Config.withDefault(10),
71
+ ),
72
+ });
73
+ var EmbeddingsConfig = Config.all({
74
+ /**
75
+ * Embedding provider to use
76
+ * Default: 'openai'
77
+ */
78
+ provider: Config.literal(
79
+ "openai",
80
+ "ollama",
81
+ "lm-studio",
82
+ "openrouter",
83
+ )("provider").pipe(Config.withDefault("openai")),
84
+ /**
85
+ * Custom base URL for the embedding API
86
+ * If not specified, provider-specific defaults are used:
87
+ * - openai: https://api.openai.com/v1
88
+ * - ollama: http://localhost:11434/v1
89
+ * - lm-studio: http://localhost:1234/v1
90
+ * - openrouter: https://openrouter.ai/api/v1
91
+ */
92
+ baseURL: Config.option(Config.string("baseURL")),
93
+ /**
94
+ * OpenAI embedding model to use
95
+ * Default: 'text-embedding-3-small'
96
+ */
97
+ model: Config.string("model").pipe(
98
+ Config.withDefault("text-embedding-3-small"),
99
+ ),
100
+ /**
101
+ * Number of dimensions for embeddings
102
+ * Lower dimensions = faster search, higher = more accuracy
103
+ * Default: 512
104
+ */
105
+ dimensions: Config.number("dimensions").pipe(Config.withDefault(512)),
106
+ /**
107
+ * Batch size for embedding API calls
108
+ * Default: 100
109
+ */
110
+ batchSize: Config.number("batchSize").pipe(Config.withDefault(100)),
111
+ /**
112
+ * Maximum retries for failed API calls
113
+ * Default: 3
114
+ */
115
+ maxRetries: Config.number("maxRetries").pipe(Config.withDefault(3)),
116
+ /**
117
+ * Delay between retries in milliseconds
118
+ * Default: 1000
119
+ */
120
+ retryDelayMs: Config.number("retryDelayMs").pipe(Config.withDefault(1e3)),
121
+ /**
122
+ * Request timeout in milliseconds
123
+ * Default: 30000 (30 seconds)
124
+ */
125
+ timeoutMs: Config.number("timeoutMs").pipe(Config.withDefault(3e4)),
126
+ /**
127
+ * OpenAI API key (usually from environment variable)
128
+ * No default - must be provided
129
+ */
130
+ apiKey: Config.option(Config.string("apiKey")),
131
+ });
132
+ var OutputConfig = Config.all({
133
+ /**
134
+ * Default output format
135
+ * Default: 'text'
136
+ */
137
+ format: Config.literal(
138
+ "text",
139
+ "json",
140
+ )("format").pipe(Config.withDefault("text")),
141
+ /**
142
+ * Whether to use colors in terminal output
143
+ * Default: true
144
+ */
145
+ color: Config.boolean("color").pipe(Config.withDefault(true)),
146
+ /**
147
+ * Whether to pretty-print JSON output
148
+ * Default: true
149
+ */
150
+ prettyJson: Config.boolean("prettyJson").pipe(Config.withDefault(true)),
151
+ /**
152
+ * Whether to show verbose output
153
+ * Default: false
154
+ */
155
+ verbose: Config.boolean("verbose").pipe(Config.withDefault(false)),
156
+ /**
157
+ * Whether to show debug information
158
+ * Default: false
159
+ */
160
+ debug: Config.boolean("debug").pipe(Config.withDefault(false)),
161
+ });
162
+ var SummarizationConfig = Config.all({
163
+ /**
164
+ * Token budget for 'brief' compression level
165
+ * Default: 100
166
+ */
167
+ briefTokenBudget: Config.number("briefTokenBudget").pipe(
168
+ Config.withDefault(100),
169
+ ),
170
+ /**
171
+ * Token budget for 'summary' compression level
172
+ * Default: 500
173
+ */
174
+ summaryTokenBudget: Config.number("summaryTokenBudget").pipe(
175
+ Config.withDefault(500),
176
+ ),
177
+ /**
178
+ * Target compression ratio for summaries (0-1)
179
+ * Default: 0.3 (30% of original)
180
+ */
181
+ compressionRatio: Config.number("compressionRatio").pipe(
182
+ Config.withDefault(0.3),
183
+ ),
184
+ /**
185
+ * Minimum tokens for any section summary
186
+ * Default: 20
187
+ */
188
+ minSectionTokens: Config.number("minSectionTokens").pipe(
189
+ Config.withDefault(20),
190
+ ),
191
+ /**
192
+ * Maximum topics to extract from a document
193
+ * Default: 10
194
+ */
195
+ maxTopics: Config.number("maxTopics").pipe(Config.withDefault(10)),
196
+ /**
197
+ * Minimum remaining budget to include partial content
198
+ * Default: 50
199
+ */
200
+ minPartialBudget: Config.number("minPartialBudget").pipe(
201
+ Config.withDefault(50),
202
+ ),
203
+ });
204
+ var PathsConfig = Config.all({
205
+ /**
206
+ * Root directory for markdown files (default: current working directory)
207
+ */
208
+ root: Config.option(Config.string("root")),
209
+ /**
210
+ * Custom config file path (default: auto-detected)
211
+ */
212
+ configFile: Config.option(Config.string("configFile")),
213
+ /**
214
+ * Cache directory for temporary files
215
+ * Default: '.mdcontext/cache'
216
+ */
217
+ cacheDir: Config.string("cacheDir").pipe(
218
+ Config.withDefault(".mdcontext/cache"),
219
+ ),
220
+ });
221
+ var MdContextConfig = Config.all({
222
+ index: Config.nested(IndexConfig, "index"),
223
+ search: Config.nested(SearchConfig, "search"),
224
+ embeddings: Config.nested(EmbeddingsConfig, "embeddings"),
225
+ summarization: Config.nested(SummarizationConfig, "summarization"),
226
+ output: Config.nested(OutputConfig, "output"),
227
+ paths: Config.nested(PathsConfig, "paths"),
228
+ });
229
+ var defaultConfig = {
230
+ index: {
231
+ maxDepth: 10,
232
+ excludePatterns: ["node_modules", ".git", "dist", "build"],
233
+ fileExtensions: [".md", ".mdx"],
234
+ followSymlinks: false,
235
+ indexDir: ".mdcontext",
236
+ },
237
+ search: {
238
+ defaultLimit: 10,
239
+ maxLimit: 100,
240
+ minSimilarity: 0.5,
241
+ includeSnippets: true,
242
+ snippetLength: 200,
243
+ autoIndexThreshold: 10,
244
+ },
245
+ embeddings: {
246
+ provider: "openai",
247
+ baseURL: Option.none(),
248
+ model: "text-embedding-3-small",
249
+ dimensions: 512,
250
+ batchSize: 100,
251
+ maxRetries: 3,
252
+ retryDelayMs: 1e3,
253
+ timeoutMs: 3e4,
254
+ apiKey: Option.none(),
255
+ },
256
+ summarization: {
257
+ briefTokenBudget: 100,
258
+ summaryTokenBudget: 500,
259
+ compressionRatio: 0.3,
260
+ minSectionTokens: 20,
261
+ maxTopics: 10,
262
+ minPartialBudget: 50,
263
+ },
264
+ output: {
265
+ format: "text",
266
+ color: true,
267
+ prettyJson: true,
268
+ verbose: false,
269
+ debug: false,
270
+ },
271
+ paths: {
272
+ root: Option.none(),
273
+ configFile: Option.none(),
274
+ cacheDir: ".mdcontext/cache",
275
+ },
276
+ };
277
+
278
+ export {
279
+ IndexConfig,
280
+ SearchConfig,
281
+ EmbeddingsConfig,
282
+ OutputConfig,
283
+ SummarizationConfig,
284
+ PathsConfig,
285
+ MdContextConfig,
286
+ defaultConfig,
287
+ };