mdcontext 0.0.1 → 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 (337) hide show
  1. package/.changeset/README.md +28 -0
  2. package/.changeset/config.json +11 -0
  3. package/.claude/settings.local.json +25 -0
  4. package/.github/workflows/ci.yml +83 -0
  5. package/.github/workflows/claude-code-review.yml +44 -0
  6. package/.github/workflows/claude.yml +85 -0
  7. package/.github/workflows/release.yml +113 -0
  8. package/.tldrignore +112 -0
  9. package/BACKLOG.md +338 -0
  10. package/CONTRIBUTING.md +186 -0
  11. package/NOTES/NOTES +44 -0
  12. package/README.md +434 -11
  13. package/biome.json +36 -0
  14. package/cspell.config.yaml +14 -0
  15. package/dist/chunk-23UPXDNL.js +3044 -0
  16. package/dist/chunk-2W7MO2DL.js +1366 -0
  17. package/dist/chunk-3NUAZGMA.js +1689 -0
  18. package/dist/chunk-7TOWB2XB.js +366 -0
  19. package/dist/chunk-7XOTOADQ.js +3065 -0
  20. package/dist/chunk-AH2PDM2K.js +3042 -0
  21. package/dist/chunk-BNXWSZ63.js +3742 -0
  22. package/dist/chunk-BTL5DJVU.js +3222 -0
  23. package/dist/chunk-HDHYG7E4.js +104 -0
  24. package/dist/chunk-HLR4KZBP.js +3234 -0
  25. package/dist/chunk-IP3FRFEB.js +1045 -0
  26. package/dist/chunk-KHU56VDO.js +3042 -0
  27. package/dist/chunk-KRYIFLQR.js +88 -0
  28. package/dist/chunk-LBSDNLEM.js +287 -0
  29. package/dist/chunk-MNTQ7HCP.js +2643 -0
  30. package/dist/chunk-MUJELQQ6.js +1387 -0
  31. package/dist/chunk-MXJGMSLV.js +2199 -0
  32. package/dist/chunk-N6QJGC3Z.js +2636 -0
  33. package/dist/chunk-OBELGBPM.js +1713 -0
  34. package/dist/chunk-OT7R5XTA.js +3192 -0
  35. package/dist/chunk-P7X4RA2T.js +106 -0
  36. package/dist/chunk-PIDUQNC2.js +3185 -0
  37. package/dist/chunk-POGCDIH4.js +3187 -0
  38. package/dist/chunk-PSIEOQGZ.js +3043 -0
  39. package/dist/chunk-PVRT3IHA.js +3238 -0
  40. package/dist/chunk-QNN4TT23.js +1430 -0
  41. package/dist/chunk-RE3R45RJ.js +3042 -0
  42. package/dist/chunk-S7E6TFX6.js +803 -0
  43. package/dist/chunk-SG6GLU4U.js +1378 -0
  44. package/dist/chunk-SJCDV2ST.js +274 -0
  45. package/dist/chunk-SYE5XLF3.js +104 -0
  46. package/dist/chunk-T5VLYBZD.js +103 -0
  47. package/dist/chunk-TOQB7VWU.js +3238 -0
  48. package/dist/chunk-VFNMZ4ZQ.js +3228 -0
  49. package/dist/chunk-VVTGZNBT.js +1629 -0
  50. package/dist/chunk-W7Q4RFEV.js +104 -0
  51. package/dist/chunk-XTYYVRLO.js +3190 -0
  52. package/dist/chunk-Y6MDYVJD.js +3063 -0
  53. package/dist/cli/main.d.ts +1 -0
  54. package/dist/cli/main.js +5458 -0
  55. package/dist/index.d.ts +653 -0
  56. package/dist/index.js +79 -0
  57. package/dist/mcp/server.d.ts +1 -0
  58. package/dist/mcp/server.js +472 -0
  59. package/dist/schema-BAWSG7KY.js +22 -0
  60. package/dist/schema-E3QUPL26.js +20 -0
  61. package/dist/schema-EHL7WUT6.js +20 -0
  62. package/docs/019-USAGE.md +625 -0
  63. package/docs/020-current-implementation.md +364 -0
  64. package/docs/021-DOGFOODING-FINDINGS.md +175 -0
  65. package/docs/BACKLOG.md +80 -0
  66. package/docs/CONFIG.md +1123 -0
  67. package/docs/DESIGN.md +439 -0
  68. package/docs/ERRORS.md +383 -0
  69. package/docs/PROJECT.md +88 -0
  70. package/docs/ROADMAP.md +407 -0
  71. package/docs/summarization.md +320 -0
  72. package/docs/test-links.md +9 -0
  73. package/justfile +40 -0
  74. package/package.json +74 -9
  75. package/pnpm-workspace.yaml +5 -0
  76. package/research/INDEX.md +315 -0
  77. package/research/code-review/README.md +90 -0
  78. package/research/code-review/cli-error-handling-review.md +979 -0
  79. package/research/code-review/code-review-validation-report.md +464 -0
  80. package/research/code-review/main-ts-review.md +1128 -0
  81. package/research/config-analysis/01-current-implementation.md +470 -0
  82. package/research/config-analysis/02-strategy-recommendation.md +428 -0
  83. package/research/config-analysis/03-task-candidates.md +715 -0
  84. package/research/config-analysis/033-research-configuration-management.md +828 -0
  85. package/research/config-analysis/034-research-effect-cli-config.md +1504 -0
  86. package/research/config-analysis/04-consolidated-task-candidates.md +277 -0
  87. package/research/config-docs/SUMMARY.md +357 -0
  88. package/research/config-docs/TEST-RESULTS.md +776 -0
  89. package/research/config-docs/TODO.md +542 -0
  90. package/research/config-docs/analysis.md +744 -0
  91. package/research/config-docs/fix-validation.md +502 -0
  92. package/research/config-docs/help-audit.md +264 -0
  93. package/research/config-docs/help-system-analysis.md +890 -0
  94. package/research/dogfood/consolidated-tool-evaluation.md +373 -0
  95. package/research/dogfood/strategy-a/a-synthesis.md +184 -0
  96. package/research/dogfood/strategy-a/a1-docs.md +226 -0
  97. package/research/dogfood/strategy-a/a2-amorphic.md +156 -0
  98. package/research/dogfood/strategy-a/a3-llm.md +164 -0
  99. package/research/dogfood/strategy-b/b-synthesis.md +228 -0
  100. package/research/dogfood/strategy-b/b1-architecture.md +207 -0
  101. package/research/dogfood/strategy-b/b2-gaps.md +258 -0
  102. package/research/dogfood/strategy-b/b3-workflows.md +250 -0
  103. package/research/dogfood/strategy-c/c-synthesis.md +451 -0
  104. package/research/dogfood/strategy-c/c1-explorer.md +192 -0
  105. package/research/dogfood/strategy-c/c2-diver-memory.md +145 -0
  106. package/research/dogfood/strategy-c/c3-diver-control.md +148 -0
  107. package/research/dogfood/strategy-c/c4-diver-failure.md +151 -0
  108. package/research/dogfood/strategy-c/c5-diver-execution.md +221 -0
  109. package/research/dogfood/strategy-c/c6-diver-org.md +221 -0
  110. package/research/effect-cli-error-handling.md +845 -0
  111. package/research/effect-errors-as-values.md +943 -0
  112. package/research/errors-task-analysis/00-consolidated-tasks.md +207 -0
  113. package/research/errors-task-analysis/cli-commands-analysis.md +909 -0
  114. package/research/errors-task-analysis/embeddings-analysis.md +709 -0
  115. package/research/errors-task-analysis/index-search-analysis.md +812 -0
  116. package/research/frontmatter/COMMENTS-ARE-SKIPPED.md +149 -0
  117. package/research/frontmatter/LLM-CODE-NAVIGATION.md +276 -0
  118. package/research/issue-review.md +603 -0
  119. package/research/llm-summarization/agent-cli-tools-2026.md +1082 -0
  120. package/research/llm-summarization/alternative-providers-2026.md +1428 -0
  121. package/research/llm-summarization/anthropic-2026.md +367 -0
  122. package/research/llm-summarization/claude-cli-integration.md +1706 -0
  123. package/research/llm-summarization/cli-integration-patterns.md +3155 -0
  124. package/research/llm-summarization/openai-2026.md +473 -0
  125. package/research/llm-summarization/openai-compatible-providers-2026.md +1022 -0
  126. package/research/llm-summarization/opencode-cli-integration.md +1552 -0
  127. package/research/llm-summarization/prompt-engineering-2026.md +1426 -0
  128. package/research/llm-summarization/prototype-results.md +56 -0
  129. package/research/llm-summarization/provider-switching-patterns-2026.md +2153 -0
  130. package/research/llm-summarization/typescript-llm-libraries-2026.md +2436 -0
  131. package/research/mdcontext-error-analysis.md +521 -0
  132. package/research/mdcontext-pudding/00-EXECUTIVE-SUMMARY.md +282 -0
  133. package/research/mdcontext-pudding/01-index-embed.md +956 -0
  134. package/research/mdcontext-pudding/02-search-COMMANDS.md +142 -0
  135. package/research/mdcontext-pudding/02-search-SUMMARY.md +146 -0
  136. package/research/mdcontext-pudding/02-search.md +970 -0
  137. package/research/mdcontext-pudding/03-context.md +779 -0
  138. package/research/mdcontext-pudding/04-navigation-and-analytics.md +803 -0
  139. package/research/mdcontext-pudding/04-tree.md +704 -0
  140. package/research/mdcontext-pudding/05-config.md +1038 -0
  141. package/research/mdcontext-pudding/06-links-summary.txt +87 -0
  142. package/research/mdcontext-pudding/06-links.md +679 -0
  143. package/research/mdcontext-pudding/07-stats.md +693 -0
  144. package/research/mdcontext-pudding/BUG-FIX-PLAN.md +388 -0
  145. package/research/mdcontext-pudding/P0-BUG-VALIDATION.md +167 -0
  146. package/research/mdcontext-pudding/README.md +168 -0
  147. package/research/mdcontext-pudding/TESTING-SUMMARY.md +128 -0
  148. package/research/npm_publish/011-npm-workflow-research-agent2.md +792 -0
  149. package/research/npm_publish/012-npm-workflow-research-agent1.md +530 -0
  150. package/research/npm_publish/013-npm-workflow-research-agent3.md +722 -0
  151. package/research/npm_publish/014-npm-workflow-synthesis.md +556 -0
  152. package/research/npm_publish/031-npm-workflow-task-analysis.md +134 -0
  153. package/research/research-quality-review.md +834 -0
  154. package/research/semantic-search/002-research-embedding-models.md +490 -0
  155. package/research/semantic-search/003-research-rag-alternatives.md +523 -0
  156. package/research/semantic-search/004-research-vector-search.md +841 -0
  157. package/research/semantic-search/032-research-semantic-search.md +427 -0
  158. package/research/semantic-search/embedding-text-analysis.md +156 -0
  159. package/research/semantic-search/multi-word-failure-reproduction.md +171 -0
  160. package/research/semantic-search/query-processing-analysis.md +207 -0
  161. package/research/semantic-search/root-cause-and-solution.md +114 -0
  162. package/research/semantic-search/threshold-validation-report.md +69 -0
  163. package/research/semantic-search/vector-search-analysis.md +63 -0
  164. package/research/task-management-2026/00-synthesis-recommendations.md +295 -0
  165. package/research/task-management-2026/01-ai-workflow-tools.md +416 -0
  166. package/research/task-management-2026/02-agent-framework-patterns.md +476 -0
  167. package/research/task-management-2026/03-lightweight-file-based.md +567 -0
  168. package/research/task-management-2026/04-established-tools-ai-features.md +541 -0
  169. package/research/task-management-2026/linear/01-core-features-workflow.md +771 -0
  170. package/research/task-management-2026/linear/02-api-integrations.md +930 -0
  171. package/research/task-management-2026/linear/03-ai-features.md +368 -0
  172. package/research/task-management-2026/linear/04-pricing-setup.md +205 -0
  173. package/research/task-management-2026/linear/05-usage-patterns-best-practices.md +605 -0
  174. package/research/test-path-issues.md +276 -0
  175. package/review/ALP-76/1-error-type-design.md +962 -0
  176. package/review/ALP-76/2-error-handling-patterns.md +906 -0
  177. package/review/ALP-76/3-error-presentation.md +624 -0
  178. package/review/ALP-76/4-test-coverage.md +625 -0
  179. package/review/ALP-76/5-migration-completeness.md +440 -0
  180. package/review/ALP-76/6-effect-best-practices.md +755 -0
  181. package/scripts/apply-branch-protection.sh +47 -0
  182. package/scripts/branch-protection-templates.json +79 -0
  183. package/scripts/prototype-summarization.ts +346 -0
  184. package/scripts/rebuild-hnswlib.js +58 -0
  185. package/scripts/setup-branch-protection.sh +64 -0
  186. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/active-provider.json +7 -0
  187. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/bm25.json +541 -0
  188. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/bm25.meta.json +5 -0
  189. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/config.json +8 -0
  190. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.bin +0 -0
  191. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.meta.bin +0 -0
  192. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/indexes/documents.json +60 -0
  193. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/indexes/links.json +13 -0
  194. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/indexes/sections.json +1197 -0
  195. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/configuration-management.md +99 -0
  196. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/distributed-systems.md +92 -0
  197. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/error-handling.md +78 -0
  198. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/failure-automation.md +55 -0
  199. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/job-context.md +69 -0
  200. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/process-orchestration.md +99 -0
  201. package/src/cli/argv-preprocessor.test.ts +210 -0
  202. package/src/cli/argv-preprocessor.ts +202 -0
  203. package/src/cli/cli.test.ts +627 -0
  204. package/src/cli/commands/backlinks.ts +54 -0
  205. package/src/cli/commands/config-cmd.ts +642 -0
  206. package/src/cli/commands/context.ts +285 -0
  207. package/src/cli/commands/duplicates.ts +122 -0
  208. package/src/cli/commands/embeddings.ts +529 -0
  209. package/src/cli/commands/index-cmd.ts +480 -0
  210. package/src/cli/commands/index.ts +16 -0
  211. package/src/cli/commands/links.ts +52 -0
  212. package/src/cli/commands/search.ts +1281 -0
  213. package/src/cli/commands/stats.ts +149 -0
  214. package/src/cli/commands/tree.ts +128 -0
  215. package/src/cli/config-layer.ts +176 -0
  216. package/src/cli/error-handler.test.ts +235 -0
  217. package/src/cli/error-handler.ts +655 -0
  218. package/src/cli/flag-schemas.ts +341 -0
  219. package/src/cli/help.ts +588 -0
  220. package/src/cli/index.ts +9 -0
  221. package/src/cli/main.ts +435 -0
  222. package/src/cli/options.ts +41 -0
  223. package/src/cli/shared-error-handling.ts +199 -0
  224. package/src/cli/typo-suggester.test.ts +105 -0
  225. package/src/cli/typo-suggester.ts +130 -0
  226. package/src/cli/utils.ts +259 -0
  227. package/src/config/file-provider.test.ts +320 -0
  228. package/src/config/file-provider.ts +273 -0
  229. package/src/config/index.ts +72 -0
  230. package/src/config/integration.test.ts +667 -0
  231. package/src/config/precedence.test.ts +277 -0
  232. package/src/config/precedence.ts +451 -0
  233. package/src/config/schema.test.ts +414 -0
  234. package/src/config/schema.ts +603 -0
  235. package/src/config/service.test.ts +320 -0
  236. package/src/config/service.ts +243 -0
  237. package/src/config/testing.test.ts +264 -0
  238. package/src/config/testing.ts +110 -0
  239. package/src/core/index.ts +1 -0
  240. package/src/core/types.ts +113 -0
  241. package/src/duplicates/detector.test.ts +183 -0
  242. package/src/duplicates/detector.ts +414 -0
  243. package/src/duplicates/index.ts +18 -0
  244. package/src/embeddings/embedding-namespace.test.ts +300 -0
  245. package/src/embeddings/embedding-namespace.ts +947 -0
  246. package/src/embeddings/heading-boost.test.ts +222 -0
  247. package/src/embeddings/hnsw-build-options.test.ts +198 -0
  248. package/src/embeddings/hyde.test.ts +272 -0
  249. package/src/embeddings/hyde.ts +264 -0
  250. package/src/embeddings/index.ts +10 -0
  251. package/src/embeddings/openai-provider.ts +414 -0
  252. package/src/embeddings/pricing.json +22 -0
  253. package/src/embeddings/provider-constants.ts +204 -0
  254. package/src/embeddings/provider-errors.test.ts +967 -0
  255. package/src/embeddings/provider-errors.ts +565 -0
  256. package/src/embeddings/provider-factory.test.ts +240 -0
  257. package/src/embeddings/provider-factory.ts +225 -0
  258. package/src/embeddings/provider-integration.test.ts +788 -0
  259. package/src/embeddings/query-preprocessing.test.ts +187 -0
  260. package/src/embeddings/semantic-search-threshold.test.ts +508 -0
  261. package/src/embeddings/semantic-search.ts +1270 -0
  262. package/src/embeddings/types.ts +359 -0
  263. package/src/embeddings/vector-store.ts +708 -0
  264. package/src/embeddings/voyage-provider.ts +313 -0
  265. package/src/errors/errors.test.ts +845 -0
  266. package/src/errors/index.ts +533 -0
  267. package/src/index/ignore-patterns.test.ts +354 -0
  268. package/src/index/ignore-patterns.ts +305 -0
  269. package/src/index/index.ts +4 -0
  270. package/src/index/indexer.ts +684 -0
  271. package/src/index/storage.ts +260 -0
  272. package/src/index/types.ts +147 -0
  273. package/src/index/watcher.ts +189 -0
  274. package/src/index.ts +30 -0
  275. package/src/integration/search-keyword.test.ts +678 -0
  276. package/src/mcp/server.ts +612 -0
  277. package/src/parser/index.ts +1 -0
  278. package/src/parser/parser.test.ts +291 -0
  279. package/src/parser/parser.ts +394 -0
  280. package/src/parser/section-filter.test.ts +277 -0
  281. package/src/parser/section-filter.ts +392 -0
  282. package/src/search/__tests__/hybrid-search.test.ts +650 -0
  283. package/src/search/bm25-store.ts +366 -0
  284. package/src/search/cross-encoder.test.ts +253 -0
  285. package/src/search/cross-encoder.ts +406 -0
  286. package/src/search/fuzzy-search.test.ts +419 -0
  287. package/src/search/fuzzy-search.ts +273 -0
  288. package/src/search/hybrid-search.ts +448 -0
  289. package/src/search/path-matcher.test.ts +276 -0
  290. package/src/search/path-matcher.ts +33 -0
  291. package/src/search/query-parser.test.ts +260 -0
  292. package/src/search/query-parser.ts +319 -0
  293. package/src/search/searcher.test.ts +280 -0
  294. package/src/search/searcher.ts +724 -0
  295. package/src/search/wink-bm25.d.ts +30 -0
  296. package/src/summarization/cli-providers/claude.ts +202 -0
  297. package/src/summarization/cli-providers/detection.test.ts +273 -0
  298. package/src/summarization/cli-providers/detection.ts +118 -0
  299. package/src/summarization/cli-providers/index.ts +8 -0
  300. package/src/summarization/cost.test.ts +139 -0
  301. package/src/summarization/cost.ts +102 -0
  302. package/src/summarization/error-handler.test.ts +127 -0
  303. package/src/summarization/error-handler.ts +111 -0
  304. package/src/summarization/index.ts +102 -0
  305. package/src/summarization/pipeline.test.ts +498 -0
  306. package/src/summarization/pipeline.ts +231 -0
  307. package/src/summarization/prompts.test.ts +269 -0
  308. package/src/summarization/prompts.ts +133 -0
  309. package/src/summarization/provider-factory.test.ts +396 -0
  310. package/src/summarization/provider-factory.ts +178 -0
  311. package/src/summarization/types.ts +184 -0
  312. package/src/summarize/budget-bugs.test.ts +620 -0
  313. package/src/summarize/formatters.ts +419 -0
  314. package/src/summarize/index.ts +20 -0
  315. package/src/summarize/summarizer.test.ts +275 -0
  316. package/src/summarize/summarizer.ts +597 -0
  317. package/src/summarize/verify-bugs.test.ts +238 -0
  318. package/src/types/huggingface-transformers.d.ts +66 -0
  319. package/src/utils/index.ts +1 -0
  320. package/src/utils/tokens.test.ts +142 -0
  321. package/src/utils/tokens.ts +186 -0
  322. package/tests/fixtures/cli/.mdcontext/active-provider.json +7 -0
  323. package/tests/fixtures/cli/.mdcontext/config.json +8 -0
  324. package/tests/fixtures/cli/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.bin +0 -0
  325. package/tests/fixtures/cli/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.meta.bin +0 -0
  326. package/tests/fixtures/cli/.mdcontext/indexes/documents.json +33 -0
  327. package/tests/fixtures/cli/.mdcontext/indexes/links.json +12 -0
  328. package/tests/fixtures/cli/.mdcontext/indexes/sections.json +247 -0
  329. package/tests/fixtures/cli/README.md +9 -0
  330. package/tests/fixtures/cli/api-reference.md +11 -0
  331. package/tests/fixtures/cli/getting-started.md +11 -0
  332. package/tests/integration/embed-index.test.ts +712 -0
  333. package/tests/integration/search-context.test.ts +469 -0
  334. package/tests/integration/search-semantic.test.ts +522 -0
  335. package/tsconfig.json +26 -0
  336. package/vitest.config.ts +16 -0
  337. package/vitest.setup.ts +12 -0
@@ -0,0 +1,603 @@
1
+ /**
2
+ * Effect Config Schema Module
3
+ *
4
+ * Defines all configuration options using Effect's Config combinators.
5
+ * This provides native integration with Effect's ConfigProvider system,
6
+ * enabling compile-time tracking of config requirements through the type system.
7
+ *
8
+ * ## Configuration Structure
9
+ *
10
+ * - index: Settings for the indexing process
11
+ * - search: Settings for search operations
12
+ * - embeddings: Settings for semantic embeddings (OpenAI)
13
+ * - output: Settings for CLI output formatting
14
+ * - paths: Settings for file paths and directories
15
+ *
16
+ * ## Usage
17
+ *
18
+ * ```typescript
19
+ * import { MdContextConfig, IndexConfig } from './config/schema.js'
20
+ * import { Effect } from 'effect'
21
+ *
22
+ * const program = Effect.gen(function* () {
23
+ * const config = yield* MdContextConfig
24
+ * console.log(`Max depth: ${config.index.maxDepth}`)
25
+ * })
26
+ * ```
27
+ */
28
+
29
+ import { Config, Option } from 'effect'
30
+
31
+ // ============================================================================
32
+ // Index Configuration
33
+ // ============================================================================
34
+
35
+ /**
36
+ * Configuration for the indexing process
37
+ */
38
+ export const IndexConfig = Config.all({
39
+ /**
40
+ * Maximum directory depth to traverse when indexing
41
+ * Default: 10
42
+ */
43
+ maxDepth: Config.number('maxDepth').pipe(Config.withDefault(10)),
44
+
45
+ /**
46
+ * Glob patterns to exclude from indexing (comma-separated)
47
+ * Default: ['node_modules', '.git', 'dist', 'build']
48
+ */
49
+ excludePatterns: Config.array(Config.string(), 'excludePatterns').pipe(
50
+ Config.withDefault(['node_modules', '.git', 'dist', 'build']),
51
+ ),
52
+
53
+ /**
54
+ * File extensions to index (comma-separated)
55
+ * Default: ['.md', '.mdx']
56
+ */
57
+ fileExtensions: Config.array(Config.string(), 'fileExtensions').pipe(
58
+ Config.withDefault(['.md', '.mdx']),
59
+ ),
60
+
61
+ /**
62
+ * Whether to follow symlinks when traversing directories
63
+ * Default: false
64
+ */
65
+ followSymlinks: Config.boolean('followSymlinks').pipe(
66
+ Config.withDefault(false),
67
+ ),
68
+
69
+ /**
70
+ * Directory where index files are stored (relative to project root)
71
+ * Default: '.mdcontext'
72
+ */
73
+ indexDir: Config.string('indexDir').pipe(Config.withDefault('.mdcontext')),
74
+ })
75
+
76
+ /**
77
+ * Inferred type for index configuration
78
+ */
79
+ export type IndexConfig = Config.Config.Success<typeof IndexConfig>
80
+
81
+ // ============================================================================
82
+ // Search Configuration
83
+ // ============================================================================
84
+
85
+ /**
86
+ * Configuration for search operations
87
+ */
88
+ export const SearchConfig = Config.all({
89
+ /**
90
+ * Default number of search results to return
91
+ * Default: 10
92
+ */
93
+ defaultLimit: Config.number('defaultLimit').pipe(Config.withDefault(10)),
94
+
95
+ /**
96
+ * Maximum number of search results allowed
97
+ * Default: 100
98
+ */
99
+ maxLimit: Config.number('maxLimit').pipe(Config.withDefault(100)),
100
+
101
+ /**
102
+ * Minimum similarity score for semantic search results (0-1)
103
+ * Lower values return more results but may include less relevant matches.
104
+ * Default: 0.35 (captures single-word queries that score 30-40%)
105
+ */
106
+ minSimilarity: Config.number('minSimilarity').pipe(Config.withDefault(0.35)),
107
+
108
+ /**
109
+ * Whether to include content snippets in search results
110
+ * Default: true
111
+ */
112
+ includeSnippets: Config.boolean('includeSnippets').pipe(
113
+ Config.withDefault(true),
114
+ ),
115
+
116
+ /**
117
+ * Maximum length of content snippets in characters
118
+ * Default: 200
119
+ */
120
+ snippetLength: Config.number('snippetLength').pipe(Config.withDefault(200)),
121
+
122
+ /**
123
+ * Auto-create semantic index if estimated time is under this threshold (seconds)
124
+ * Default: 10
125
+ */
126
+ autoIndexThreshold: Config.number('autoIndexThreshold').pipe(
127
+ Config.withDefault(10),
128
+ ),
129
+ })
130
+
131
+ /**
132
+ * Inferred type for search configuration
133
+ */
134
+ export type SearchConfig = Config.Config.Success<typeof SearchConfig>
135
+
136
+ // ============================================================================
137
+ // Embeddings Configuration
138
+ // ============================================================================
139
+
140
+ /**
141
+ * Supported embedding providers
142
+ *
143
+ * - openai: OpenAI's text-embedding-3 models (default)
144
+ * - ollama: Local Ollama server with nomic-embed-text or similar
145
+ * - lm-studio: LM Studio's local embedding server
146
+ * - openrouter: OpenRouter API gateway for multiple providers
147
+ */
148
+ export type EmbeddingProvider =
149
+ | 'openai'
150
+ | 'ollama'
151
+ | 'lm-studio'
152
+ | 'openrouter'
153
+ | 'voyage'
154
+
155
+ /**
156
+ * Supported OpenAI embedding models
157
+ */
158
+ export type OpenAIEmbeddingModel =
159
+ | 'text-embedding-3-small'
160
+ | 'text-embedding-3-large'
161
+ | 'text-embedding-ada-002'
162
+
163
+ /**
164
+ * Configuration for semantic embeddings
165
+ */
166
+ export const EmbeddingsConfig = Config.all({
167
+ /**
168
+ * Embedding provider to use
169
+ * Default: 'openai'
170
+ */
171
+ provider: Config.literal(
172
+ 'openai',
173
+ 'ollama',
174
+ 'lm-studio',
175
+ 'openrouter',
176
+ 'voyage',
177
+ )('provider').pipe(Config.withDefault('openai' as const)),
178
+
179
+ /**
180
+ * Custom base URL for the embedding API
181
+ * If not specified, provider-specific defaults are used:
182
+ * - openai: https://api.openai.com/v1
183
+ * - ollama: http://localhost:11434/v1
184
+ * - lm-studio: http://localhost:1234/v1
185
+ * - openrouter: https://openrouter.ai/api/v1
186
+ */
187
+ baseURL: Config.option(Config.string('baseURL')),
188
+
189
+ /**
190
+ * OpenAI embedding model to use
191
+ * Default: 'text-embedding-3-small'
192
+ */
193
+ model: Config.string('model').pipe(
194
+ Config.withDefault('text-embedding-3-small'),
195
+ ),
196
+
197
+ /**
198
+ * Number of dimensions for embeddings
199
+ * Lower dimensions = faster search, higher = more accuracy
200
+ * Default: 512
201
+ */
202
+ dimensions: Config.number('dimensions').pipe(Config.withDefault(512)),
203
+
204
+ /**
205
+ * Batch size for embedding API calls
206
+ * Default: 100
207
+ */
208
+ batchSize: Config.number('batchSize').pipe(Config.withDefault(100)),
209
+
210
+ /**
211
+ * Maximum retries for failed API calls
212
+ * Default: 3
213
+ */
214
+ maxRetries: Config.number('maxRetries').pipe(Config.withDefault(3)),
215
+
216
+ /**
217
+ * Delay between retries in milliseconds
218
+ * Default: 1000
219
+ */
220
+ retryDelayMs: Config.number('retryDelayMs').pipe(Config.withDefault(1000)),
221
+
222
+ /**
223
+ * Request timeout in milliseconds
224
+ * Default: 30000 (30 seconds)
225
+ */
226
+ timeoutMs: Config.number('timeoutMs').pipe(Config.withDefault(30000)),
227
+
228
+ /**
229
+ * OpenAI API key (usually from environment variable)
230
+ * No default - must be provided
231
+ */
232
+ apiKey: Config.option(Config.string('apiKey')),
233
+
234
+ // HNSW Index Build Parameters
235
+ // These control the vector index structure and affect build time and search quality.
236
+ // Changing these requires rebuilding the index.
237
+
238
+ /**
239
+ * HNSW M parameter: maximum connections per node
240
+ * Higher M = better recall but larger index and slower builds
241
+ * Recommended: 12 (speed), 16 (balanced), 24 (quality)
242
+ * Default: 16
243
+ */
244
+ hnswM: Config.number('hnswM').pipe(Config.withDefault(16)),
245
+
246
+ /**
247
+ * HNSW efConstruction: construction-time search width
248
+ * Higher values = better index quality but slower builds
249
+ * Recommended: 128 (speed), 200 (balanced), 256 (quality)
250
+ * Default: 200
251
+ */
252
+ hnswEfConstruction: Config.number('hnswEfConstruction').pipe(
253
+ Config.withDefault(200),
254
+ ),
255
+ })
256
+
257
+ /**
258
+ * Inferred type for embeddings configuration
259
+ */
260
+ export type EmbeddingsConfig = Config.Config.Success<typeof EmbeddingsConfig>
261
+
262
+ // ============================================================================
263
+ // Output Configuration
264
+ // ============================================================================
265
+
266
+ /**
267
+ * Supported output formats
268
+ */
269
+ export type OutputFormat = 'text' | 'json'
270
+
271
+ /**
272
+ * Configuration for CLI output formatting
273
+ */
274
+ export const OutputConfig = Config.all({
275
+ /**
276
+ * Default output format
277
+ * Default: 'text'
278
+ */
279
+ format: Config.literal(
280
+ 'text',
281
+ 'json',
282
+ )('format').pipe(Config.withDefault('text' as const)),
283
+
284
+ /**
285
+ * Whether to use colors in terminal output
286
+ * Default: true
287
+ */
288
+ color: Config.boolean('color').pipe(Config.withDefault(true)),
289
+
290
+ /**
291
+ * Whether to pretty-print JSON output
292
+ * Default: true
293
+ */
294
+ prettyJson: Config.boolean('prettyJson').pipe(Config.withDefault(true)),
295
+
296
+ /**
297
+ * Whether to show verbose output
298
+ * Default: false
299
+ */
300
+ verbose: Config.boolean('verbose').pipe(Config.withDefault(false)),
301
+
302
+ /**
303
+ * Whether to show debug information
304
+ * Default: false
305
+ */
306
+ debug: Config.boolean('debug').pipe(Config.withDefault(false)),
307
+ })
308
+
309
+ /**
310
+ * Inferred type for output configuration
311
+ */
312
+ export type OutputConfig = Config.Config.Success<typeof OutputConfig>
313
+
314
+ // ============================================================================
315
+ // Summarization Configuration
316
+ // ============================================================================
317
+
318
+ /**
319
+ * Configuration for summarization and context assembly
320
+ */
321
+ export const SummarizationConfig = Config.all({
322
+ /**
323
+ * Token budget for 'brief' compression level
324
+ * Default: 100
325
+ */
326
+ briefTokenBudget: Config.number('briefTokenBudget').pipe(
327
+ Config.withDefault(100),
328
+ ),
329
+
330
+ /**
331
+ * Token budget for 'summary' compression level
332
+ * Default: 500
333
+ */
334
+ summaryTokenBudget: Config.number('summaryTokenBudget').pipe(
335
+ Config.withDefault(500),
336
+ ),
337
+
338
+ /**
339
+ * Target compression ratio for summaries (0-1)
340
+ * Default: 0.3 (30% of original)
341
+ */
342
+ compressionRatio: Config.number('compressionRatio').pipe(
343
+ Config.withDefault(0.3),
344
+ ),
345
+
346
+ /**
347
+ * Minimum tokens for any section summary
348
+ * Default: 20
349
+ */
350
+ minSectionTokens: Config.number('minSectionTokens').pipe(
351
+ Config.withDefault(20),
352
+ ),
353
+
354
+ /**
355
+ * Maximum topics to extract from a document
356
+ * Default: 10
357
+ */
358
+ maxTopics: Config.number('maxTopics').pipe(Config.withDefault(10)),
359
+
360
+ /**
361
+ * Minimum remaining budget to include partial content
362
+ * Default: 50
363
+ */
364
+ minPartialBudget: Config.number('minPartialBudget').pipe(
365
+ Config.withDefault(50),
366
+ ),
367
+ })
368
+
369
+ /**
370
+ * Inferred type for summarization configuration
371
+ */
372
+ export type SummarizationConfig = Config.Config.Success<
373
+ typeof SummarizationConfig
374
+ >
375
+
376
+ // ============================================================================
377
+ // AI Summarization Configuration
378
+ // ============================================================================
379
+
380
+ /**
381
+ * Supported AI summarization modes
382
+ *
383
+ * - cli: Use CLI tools like Claude Code, Copilot CLI (free with subscription)
384
+ * - api: Use API providers like DeepSeek, OpenAI (pay-per-use)
385
+ */
386
+ export type AISummarizationMode = 'cli' | 'api'
387
+
388
+ /**
389
+ * CLI provider names for AI summarization
390
+ */
391
+ export type CLIProviderName =
392
+ | 'claude'
393
+ | 'copilot'
394
+ | 'cline'
395
+ | 'aider'
396
+ | 'opencode'
397
+ | 'amp'
398
+
399
+ /**
400
+ * API provider names for AI summarization
401
+ */
402
+ export type APIProviderName =
403
+ | 'deepseek'
404
+ | 'anthropic'
405
+ | 'openai'
406
+ | 'gemini'
407
+ | 'qwen'
408
+
409
+ /**
410
+ * All provider names (CLI + API)
411
+ */
412
+ export type SummarizationProviderName = CLIProviderName | APIProviderName
413
+
414
+ /**
415
+ * Configuration for AI-powered summarization of search results.
416
+ *
417
+ * This is separate from SummarizationConfig which handles token budgets
418
+ * for context assembly. AISummarizationConfig controls the AI provider
419
+ * used to generate natural language summaries.
420
+ */
421
+ export const AISummarizationConfig = Config.all({
422
+ /**
423
+ * Summarization mode: 'cli' (free) or 'api' (pay-per-use)
424
+ * Default: 'cli' - prioritize free CLI tools
425
+ */
426
+ mode: Config.literal(
427
+ 'cli',
428
+ 'api',
429
+ )('mode').pipe(Config.withDefault('cli' as const)),
430
+
431
+ /**
432
+ * Provider name (e.g., 'claude', 'opencode' for CLI; 'deepseek', 'openai' for API)
433
+ * Default: 'claude' - most common CLI tool
434
+ */
435
+ provider: Config.literal(
436
+ // CLI providers
437
+ 'claude',
438
+ 'copilot',
439
+ 'cline',
440
+ 'aider',
441
+ 'opencode',
442
+ 'amp',
443
+ // API providers
444
+ 'deepseek',
445
+ 'anthropic',
446
+ 'openai',
447
+ 'gemini',
448
+ 'qwen',
449
+ )('provider').pipe(Config.withDefault('claude' as const)),
450
+
451
+ /**
452
+ * Model name for API providers (ignored for CLI providers)
453
+ * Default: 'deepseek-chat' - ultra-cheap default
454
+ */
455
+ model: Config.option(Config.string('model')),
456
+
457
+ /**
458
+ * Enable streaming output
459
+ * Default: false
460
+ */
461
+ stream: Config.boolean('stream').pipe(Config.withDefault(false)),
462
+
463
+ /**
464
+ * Custom API base URL (for API providers)
465
+ */
466
+ baseURL: Config.option(Config.string('baseURL')),
467
+
468
+ /**
469
+ * API key (for API providers, usually from environment)
470
+ */
471
+ apiKey: Config.option(Config.string('apiKey')),
472
+ })
473
+
474
+ /**
475
+ * Inferred type for AI summarization configuration
476
+ */
477
+ export type AISummarizationConfig = Config.Config.Success<
478
+ typeof AISummarizationConfig
479
+ >
480
+
481
+ // ============================================================================
482
+ // Paths Configuration
483
+ // ============================================================================
484
+
485
+ /**
486
+ * Configuration for file paths and directories
487
+ */
488
+ export const PathsConfig = Config.all({
489
+ /**
490
+ * Root directory for markdown files (default: current working directory)
491
+ */
492
+ root: Config.option(Config.string('root')),
493
+
494
+ /**
495
+ * Custom config file path (default: auto-detected)
496
+ */
497
+ configFile: Config.option(Config.string('configFile')),
498
+
499
+ /**
500
+ * Cache directory for temporary files
501
+ * Default: '.mdcontext/cache'
502
+ */
503
+ cacheDir: Config.string('cacheDir').pipe(
504
+ Config.withDefault('.mdcontext/cache'),
505
+ ),
506
+ })
507
+
508
+ /**
509
+ * Inferred type for paths configuration
510
+ */
511
+ export type PathsConfig = Config.Config.Success<typeof PathsConfig>
512
+
513
+ // ============================================================================
514
+ // Full Configuration
515
+ // ============================================================================
516
+
517
+ /**
518
+ * Complete mdcontext configuration
519
+ *
520
+ * Combines all configuration sections into a single nested config.
521
+ * Use with Effect's ConfigProvider to load from various sources.
522
+ */
523
+ export const MdContextConfig = Config.all({
524
+ index: Config.nested(IndexConfig, 'index'),
525
+ search: Config.nested(SearchConfig, 'search'),
526
+ embeddings: Config.nested(EmbeddingsConfig, 'embeddings'),
527
+ summarization: Config.nested(SummarizationConfig, 'summarization'),
528
+ aiSummarization: Config.nested(AISummarizationConfig, 'aiSummarization'),
529
+ output: Config.nested(OutputConfig, 'output'),
530
+ paths: Config.nested(PathsConfig, 'paths'),
531
+ })
532
+
533
+ /**
534
+ * Inferred type for the complete configuration
535
+ */
536
+ export type MdContextConfig = Config.Config.Success<typeof MdContextConfig>
537
+
538
+ // ============================================================================
539
+ // Default Configuration Values
540
+ // ============================================================================
541
+
542
+ /**
543
+ * Default configuration values as a plain object.
544
+ * Useful for initializing config files or for documentation.
545
+ */
546
+ export const defaultConfig: MdContextConfig = {
547
+ index: {
548
+ maxDepth: 10,
549
+ excludePatterns: ['node_modules', '.git', 'dist', 'build'],
550
+ fileExtensions: ['.md', '.mdx'],
551
+ followSymlinks: false,
552
+ indexDir: '.mdcontext',
553
+ },
554
+ search: {
555
+ defaultLimit: 10,
556
+ maxLimit: 100,
557
+ minSimilarity: 0.35,
558
+ includeSnippets: true,
559
+ snippetLength: 200,
560
+ autoIndexThreshold: 10,
561
+ },
562
+ embeddings: {
563
+ provider: 'openai',
564
+ baseURL: Option.none(),
565
+ model: 'text-embedding-3-small',
566
+ dimensions: 512,
567
+ batchSize: 100,
568
+ maxRetries: 3,
569
+ retryDelayMs: 1000,
570
+ timeoutMs: 30000,
571
+ apiKey: Option.none(),
572
+ hnswM: 16,
573
+ hnswEfConstruction: 200,
574
+ },
575
+ summarization: {
576
+ briefTokenBudget: 100,
577
+ summaryTokenBudget: 500,
578
+ compressionRatio: 0.3,
579
+ minSectionTokens: 20,
580
+ maxTopics: 10,
581
+ minPartialBudget: 50,
582
+ },
583
+ aiSummarization: {
584
+ mode: 'cli',
585
+ provider: 'claude',
586
+ model: Option.none(),
587
+ stream: false,
588
+ baseURL: Option.none(),
589
+ apiKey: Option.none(),
590
+ },
591
+ output: {
592
+ format: 'text',
593
+ color: true,
594
+ prettyJson: true,
595
+ verbose: false,
596
+ debug: false,
597
+ },
598
+ paths: {
599
+ root: Option.none(),
600
+ configFile: Option.none(),
601
+ cacheDir: '.mdcontext/cache',
602
+ },
603
+ }