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,715 @@
1
+ # Configuration System Task Candidates
2
+
3
+ This document outlines implementation tasks for enhancing mdcontext's configuration system, based on research from:
4
+
5
+ - [033-research-configuration-management.md](/Users/alphab/Dev/LLM/DEV/mdcontext/docs/033-research-configuration-management.md)
6
+ - [034-research-effect-cli-config.md](/Users/alphab/Dev/LLM/DEV/mdcontext/docs/034-research-effect-cli-config.md)
7
+
8
+ Tasks are ordered by recommended implementation sequence.
9
+
10
+ ---
11
+
12
+ ## Phase 1: Foundation
13
+
14
+ ### 1.1 Define Configuration Schema with Zod
15
+
16
+ **Priority**: High
17
+ **Effort**: Small
18
+ **Dependencies**: None
19
+
20
+ **Description**:
21
+ Create a Zod schema that defines all configurable options for mdcontext. This schema serves as the single source of truth for configuration shape, types, and defaults.
22
+
23
+ **Why it matters**:
24
+
25
+ - Enables runtime validation with clear error messages
26
+ - Generates TypeScript types automatically (no type/schema drift)
27
+ - Foundation for all subsequent config work
28
+ - Aligns with modern TypeScript ecosystem patterns (Vite, Nuxt, ESLint)
29
+
30
+ **Implementation outline**:
31
+
32
+ ```typescript
33
+ // src/config/schema.ts
34
+ import { z } from "zod";
35
+
36
+ export const ConfigSchema = z.object({
37
+ logLevel: z.enum(["debug", "info", "warn", "error"]).default("info"),
38
+ embeddings: z
39
+ .object({
40
+ provider: z.enum(["openai", "none"]).default("none"),
41
+ model: z.string().default("text-embedding-3-small"),
42
+ batchSize: z.number().positive().default(100),
43
+ })
44
+ .default({}),
45
+ search: z
46
+ .object({
47
+ limit: z.number().positive().default(10),
48
+ threshold: z.number().min(0).max(1).default(0.45),
49
+ autoIndexThreshold: z.number().default(10),
50
+ })
51
+ .default({}),
52
+ context: z
53
+ .object({
54
+ defaultTokenBudget: z.number().positive().default(2000),
55
+ })
56
+ .default({}),
57
+ index: z
58
+ .object({
59
+ ignorePatterns: z
60
+ .array(z.string())
61
+ .default(["**/node_modules/**", "**/.git/**"]),
62
+ })
63
+ .default({}),
64
+ });
65
+
66
+ export type Config = z.infer<typeof ConfigSchema>;
67
+ ```
68
+
69
+ ---
70
+
71
+ ### 1.2 Create defineConfig Helper
72
+
73
+ **Priority**: High
74
+ **Effort**: Small
75
+ **Dependencies**: 1.1
76
+
77
+ **Description**:
78
+ Implement a `defineConfig()` helper function that provides type inference for user config files, following the pattern used by Vite, ESLint, and Nuxt.
79
+
80
+ **Why it matters**:
81
+
82
+ - Enables IDE autocomplete in config files without JSON schemas
83
+ - Makes config files self-documenting
84
+ - Industry-standard pattern familiar to developers
85
+ - Improves developer experience significantly
86
+
87
+ **Implementation outline**:
88
+
89
+ ```typescript
90
+ // src/config/define.ts
91
+ import type { Config } from "./schema";
92
+
93
+ export function defineConfig(config: Partial<Config>): Partial<Config> {
94
+ return config;
95
+ }
96
+ ```
97
+
98
+ **Export from package**:
99
+
100
+ ```typescript
101
+ // src/index.ts
102
+ export { defineConfig } from "./config/define";
103
+ export type { Config } from "./config/schema";
104
+ ```
105
+
106
+ ---
107
+
108
+ ### 1.3 Implement Config Loader with c12
109
+
110
+ **Priority**: High
111
+ **Effort**: Medium
112
+ **Dependencies**: 1.1, 1.2
113
+
114
+ **Description**:
115
+ Create a configuration loader using c12 (UnJS) that supports multiple config file formats and locations.
116
+
117
+ **Why it matters**:
118
+
119
+ - Supports TypeScript config files natively (via jiti)
120
+ - Handles multiple formats: `.ts`, `.js`, `.json`, `.yaml`, `.toml`
121
+ - Built-in dotenv support
122
+ - Environment-specific overrides (`$development`, `$production`)
123
+ - Used by Nuxt, Prisma, and other production tools
124
+
125
+ **Implementation outline**:
126
+
127
+ ```typescript
128
+ // src/config/loader.ts
129
+ import { loadConfig } from "c12";
130
+ import { ConfigSchema, type Config } from "./schema";
131
+
132
+ export interface LoadConfigResult {
133
+ config: Config;
134
+ configFile?: string;
135
+ layers: Array<{ config: Partial<Config>; configFile?: string }>;
136
+ }
137
+
138
+ export async function loadMdcontextConfig(options?: {
139
+ cwd?: string;
140
+ overrides?: Partial<Config>;
141
+ }): Promise<LoadConfigResult> {
142
+ const {
143
+ config: rawConfig,
144
+ configFile,
145
+ layers,
146
+ } = await loadConfig({
147
+ name: "mdcontext",
148
+ cwd: options?.cwd,
149
+ defaults: ConfigSchema.parse({}),
150
+ overrides: options?.overrides,
151
+ dotenv: true,
152
+ });
153
+
154
+ const config = ConfigSchema.parse(rawConfig);
155
+ return { config, configFile, layers };
156
+ }
157
+ ```
158
+
159
+ **New dependencies**:
160
+
161
+ ```json
162
+ {
163
+ "dependencies": {
164
+ "c12": "^2.0.0"
165
+ }
166
+ }
167
+ ```
168
+
169
+ ---
170
+
171
+ ## Phase 2: CLI Integration
172
+
173
+ ### 2.1 Integrate Config with CLI Commands
174
+
175
+ **Priority**: High
176
+ **Effort**: Medium
177
+ **Dependencies**: 1.3
178
+
179
+ **Description**:
180
+ Modify CLI commands to load and use configuration, with CLI flags taking precedence over config file values.
181
+
182
+ **Why it matters**:
183
+
184
+ - Enables persistent configuration (no need to repeat flags)
185
+ - Maintains CLI flag override capability for one-off changes
186
+ - Creates consistent configuration experience across all commands
187
+
188
+ **Implementation outline**:
189
+
190
+ The precedence order should be:
191
+
192
+ 1. CLI flags (highest)
193
+ 2. Environment variables
194
+ 3. Config file
195
+ 4. Defaults (lowest)
196
+
197
+ ```typescript
198
+ // Example: search command integration
199
+ const searchCommand = Command.make(
200
+ "search",
201
+ {
202
+ /* existing options */
203
+ },
204
+ (cliOptions) =>
205
+ Effect.gen(function* () {
206
+ const { config } = yield* Effect.promise(() => loadMdcontextConfig());
207
+
208
+ // Merge: CLI flags override config
209
+ const limit = cliOptions.limit ?? config.search.limit;
210
+ const threshold = cliOptions.threshold ?? config.search.threshold;
211
+
212
+ // ... rest of command
213
+ }),
214
+ );
215
+ ```
216
+
217
+ ---
218
+
219
+ ### 2.2 Add --config Flag to CLI
220
+
221
+ **Priority**: Medium
222
+ **Effort**: Small
223
+ **Dependencies**: 2.1
224
+
225
+ **Description**:
226
+ Add a global `--config` / `-c` flag to specify a custom config file path.
227
+
228
+ **Why it matters**:
229
+
230
+ - Allows per-invocation config file selection
231
+ - Enables testing with different configurations
232
+ - Common pattern in CLI tools (ESLint, Prettier, etc.)
233
+
234
+ **Implementation outline**:
235
+
236
+ ```typescript
237
+ const configOption = Options.file("config").pipe(
238
+ Options.withAlias("c"),
239
+ Options.withDescription("Path to config file"),
240
+ Options.optional,
241
+ );
242
+ ```
243
+
244
+ ---
245
+
246
+ ### 2.3 Add Config Init Command
247
+
248
+ **Priority**: Low
249
+ **Effort**: Small
250
+ **Dependencies**: 1.2
251
+
252
+ **Description**:
253
+ Create a `mdcontext config init` command that generates a starter config file with sensible defaults.
254
+
255
+ **Why it matters**:
256
+
257
+ - Lowers barrier to config file usage
258
+ - Documents available options by example
259
+ - Common pattern in modern CLI tools
260
+
261
+ **Implementation outline**:
262
+
263
+ ```bash
264
+ $ mdcontext config init
265
+ Created mdcontext.config.ts with default settings.
266
+
267
+ $ mdcontext config init --format json
268
+ Created .mdcontextrc with default settings.
269
+ ```
270
+
271
+ ---
272
+
273
+ ## Phase 3: Environment Variables
274
+
275
+ ### 3.1 Implement Prefix-Based Environment Variables
276
+
277
+ **Priority**: Medium
278
+ **Effort**: Small
279
+ **Dependencies**: 1.1
280
+
281
+ **Description**:
282
+ Support environment variables with `MDCONTEXT_` prefix that map to config keys.
283
+
284
+ **Why it matters**:
285
+
286
+ - Standard pattern for CLI configuration
287
+ - Enables CI/CD integration without config files
288
+ - Allows secrets to stay out of config files
289
+ - Works well with containerized environments
290
+
291
+ **Implementation outline**:
292
+
293
+ ```
294
+ MDCONTEXT_LOG_LEVEL=debug
295
+ MDCONTEXT_EMBEDDINGS_PROVIDER=openai
296
+ MDCONTEXT_SEARCH_LIMIT=20
297
+ ```
298
+
299
+ ```typescript
300
+ // src/config/env.ts
301
+ import { z } from "zod";
302
+
303
+ const envSchema = z.object({
304
+ MDCONTEXT_LOG_LEVEL: z.enum(["debug", "info", "warn", "error"]).optional(),
305
+ MDCONTEXT_EMBEDDINGS_PROVIDER: z.enum(["openai", "none"]).optional(),
306
+ MDCONTEXT_EMBEDDINGS_MODEL: z.string().optional(),
307
+ MDCONTEXT_SEARCH_LIMIT: z.coerce.number().positive().optional(),
308
+ MDCONTEXT_SEARCH_THRESHOLD: z.coerce.number().min(0).max(1).optional(),
309
+ OPENAI_API_KEY: z.string().optional(),
310
+ });
311
+
312
+ export function loadEnvConfig(): Partial<Config> {
313
+ const env = envSchema.parse(process.env);
314
+ // Map to config structure...
315
+ }
316
+ ```
317
+
318
+ ---
319
+
320
+ ### 3.2 Improve API Key Handling with Redacted
321
+
322
+ **Priority**: Medium
323
+ **Effort**: Small
324
+ **Dependencies**: None (can be done independently)
325
+
326
+ **Description**:
327
+ Use Effect's `Redacted` type for handling sensitive values like API keys, preventing accidental logging.
328
+
329
+ **Why it matters**:
330
+
331
+ - Prevents secrets from appearing in logs or error messages
332
+ - First-class Effect pattern for security
333
+ - Shows `<redacted>` when converted to string
334
+
335
+ **Implementation outline**:
336
+
337
+ ```typescript
338
+ import { Config, Redacted } from "effect";
339
+
340
+ // In config loading
341
+ const apiKey = yield * Config.redacted("OPENAI_API_KEY").pipe(Config.optional);
342
+
343
+ // Safe to log
344
+ console.log(`API Key: ${apiKey}`); // "API Key: <redacted>"
345
+
346
+ // Access value only when needed
347
+ const actualKey = Redacted.value(apiKey);
348
+ ```
349
+
350
+ ---
351
+
352
+ ## Phase 4: Validation and Error Messages
353
+
354
+ ### 4.1 Implement Friendly Config Validation Errors
355
+
356
+ **Priority**: High
357
+ **Effort**: Medium
358
+ **Dependencies**: 1.1
359
+
360
+ **Description**:
361
+ Create user-friendly error messages when config validation fails, showing what's wrong and how to fix it.
362
+
363
+ **Why it matters**:
364
+
365
+ - Reduces user frustration with config issues
366
+ - Faster debugging of configuration problems
367
+ - Professional CLI experience
368
+
369
+ **Implementation outline**:
370
+
371
+ ```
372
+ $ mdcontext search "test"
373
+
374
+ Config Error: Invalid value in mdcontext.config.ts
375
+
376
+ search.threshold: Expected number between 0 and 1, got "high"
377
+
378
+ Hint: Use a decimal value like 0.45, not a string.
379
+
380
+ Location: /path/to/mdcontext.config.ts:12:15
381
+ ```
382
+
383
+ ```typescript
384
+ // src/config/errors.ts
385
+ export function formatConfigError(
386
+ error: z.ZodError,
387
+ configFile?: string,
388
+ ): string {
389
+ // Format Zod errors into friendly messages
390
+ }
391
+ ```
392
+
393
+ ---
394
+
395
+ ### 4.2 Add Config Validation Command
396
+
397
+ **Priority**: Low
398
+ **Effort**: Small
399
+ **Dependencies**: 4.1
400
+
401
+ **Description**:
402
+ Create a `mdcontext config check` command that validates the current configuration and reports any issues.
403
+
404
+ **Why it matters**:
405
+
406
+ - Allows users to verify config before running commands
407
+ - Useful for CI/CD pipelines
408
+ - Documents effective configuration (merged from all sources)
409
+
410
+ **Implementation outline**:
411
+
412
+ ```bash
413
+ $ mdcontext config check
414
+ Config loaded from: /path/to/mdcontext.config.ts
415
+
416
+ Effective configuration:
417
+ logLevel: info
418
+ embeddings.provider: openai
419
+ embeddings.model: text-embedding-3-small
420
+ search.limit: 10
421
+ search.threshold: 0.45
422
+ ...
423
+
424
+ No issues found.
425
+ ```
426
+
427
+ ---
428
+
429
+ ## Phase 5: Type Safety Improvements
430
+
431
+ ### 5.1 Create Effect Layer for Configuration
432
+
433
+ **Priority**: Medium
434
+ **Effort**: Medium
435
+ **Dependencies**: 1.3, Full Effect adoption decision
436
+
437
+ **Description**:
438
+ Wrap configuration in an Effect Layer for dependency injection, enabling cleaner testing and composition.
439
+
440
+ **Why it matters**:
441
+
442
+ - Enables mock config injection for testing
443
+ - Follows Effect best practices
444
+ - Prepares for broader Effect adoption
445
+ - Cleaner separation of concerns
446
+
447
+ **Implementation outline**:
448
+
449
+ ```typescript
450
+ // src/config/layer.ts
451
+ import { Context, Layer, Effect } from "effect"
452
+ import type { Config } from "./schema"
453
+
454
+ export class ConfigService extends Context.Tag("ConfigService")<
455
+ ConfigService,
456
+ Config
457
+ >() {}
458
+
459
+ export const ConfigLive = Layer.effect(
460
+ ConfigService,
461
+ Effect.gen(function* () {
462
+ const { config } = yield* Effect.promise(() => loadMdcontextConfig())
463
+ return config
464
+ })
465
+ )
466
+
467
+ // In commands
468
+ const searchCommand = Command.make("search", {...}, (opts) =>
469
+ Effect.gen(function* () {
470
+ const config = yield* ConfigService
471
+ // use config...
472
+ }).pipe(Effect.provide(ConfigLive))
473
+ )
474
+ ```
475
+
476
+ ---
477
+
478
+ ### 5.2 Add Schema-Based Config Type Generation
479
+
480
+ **Priority**: Low
481
+ **Effort**: Small
482
+ **Dependencies**: 1.1
483
+
484
+ **Description**:
485
+ Generate JSON Schema from Zod schema for IDE support in JSON/YAML config files.
486
+
487
+ **Why it matters**:
488
+
489
+ - Enables autocomplete in VS Code for JSON configs
490
+ - Documents all options in a standard format
491
+ - Can be published for external tool integration
492
+
493
+ **Implementation outline**:
494
+
495
+ ```typescript
496
+ // scripts/generate-schema.ts
497
+ import { zodToJsonSchema } from "zod-to-json-schema";
498
+ import { ConfigSchema } from "../src/config/schema";
499
+
500
+ const jsonSchema = zodToJsonSchema(ConfigSchema, "MdcontextConfig");
501
+ // Write to schema.json
502
+ ```
503
+
504
+ Users can then reference it:
505
+
506
+ ```json
507
+ {
508
+ "$schema": "https://raw.githubusercontent.com/user/mdcontext/main/schema.json",
509
+ "logLevel": "debug"
510
+ }
511
+ ```
512
+
513
+ ---
514
+
515
+ ## Phase 6: Testing Infrastructure
516
+
517
+ ### 6.1 Add Config Testing Utilities
518
+
519
+ **Priority**: Medium
520
+ **Effort**: Small
521
+ **Dependencies**: 1.3
522
+
523
+ **Description**:
524
+ Create test utilities for providing mock configurations in tests.
525
+
526
+ **Why it matters**:
527
+
528
+ - Enables isolated testing of commands with different configs
529
+ - Reduces test setup boilerplate
530
+ - Makes tests more reliable and deterministic
531
+
532
+ **Implementation outline**:
533
+
534
+ ```typescript
535
+ // src/config/testing.ts
536
+ import { ConfigSchema, type Config } from "./schema";
537
+
538
+ export function createTestConfig(overrides: Partial<Config> = {}): Config {
539
+ return ConfigSchema.parse({
540
+ ...ConfigSchema.parse({}),
541
+ ...overrides,
542
+ });
543
+ }
544
+
545
+ export function withMockConfig(config: Partial<Config>) {
546
+ return Layer.succeed(ConfigService, createTestConfig(config));
547
+ }
548
+ ```
549
+
550
+ ```typescript
551
+ // In tests
552
+ describe("search command", () => {
553
+ it("respects config limit", async () => {
554
+ const result = await Effect.runPromise(
555
+ searchCommand({ query: "test" }).pipe(
556
+ Effect.provide(withMockConfig({ search: { limit: 5 } })),
557
+ ),
558
+ );
559
+ expect(result.length).toBeLessThanOrEqual(5);
560
+ });
561
+ });
562
+ ```
563
+
564
+ ---
565
+
566
+ ### 6.2 Add Config Integration Tests
567
+
568
+ **Priority**: Medium
569
+ **Effort**: Medium
570
+ **Dependencies**: 6.1
571
+
572
+ **Description**:
573
+ Add integration tests that verify config loading from files, environment variables, and CLI flags work together correctly.
574
+
575
+ **Why it matters**:
576
+
577
+ - Ensures precedence order works correctly
578
+ - Validates config merging behavior
579
+ - Catches regressions in config handling
580
+
581
+ **Implementation outline**:
582
+
583
+ ```typescript
584
+ describe("config precedence", () => {
585
+ it("CLI flags override config file", async () => {
586
+ // Create temp config file with limit: 10
587
+ // Run with --limit 5
588
+ // Verify limit is 5
589
+ });
590
+
591
+ it("env vars override config file", async () => {
592
+ // Create temp config file with limit: 10
593
+ // Set MDCONTEXT_SEARCH_LIMIT=5
594
+ // Run command
595
+ // Verify limit is 5
596
+ });
597
+
598
+ it("config file overrides defaults", async () => {
599
+ // Create temp config file with limit: 20
600
+ // Run command without flags
601
+ // Verify limit is 20
602
+ });
603
+ });
604
+ ```
605
+
606
+ ---
607
+
608
+ ## Phase 7: Documentation
609
+
610
+ ### 7.1 Document Configuration Options
611
+
612
+ **Priority**: High
613
+ **Effort**: Medium
614
+ **Dependencies**: 1.1
615
+
616
+ **Description**:
617
+ Create comprehensive documentation for all configuration options, including examples for different formats.
618
+
619
+ **Why it matters**:
620
+
621
+ - Users can't use features they don't know about
622
+ - Reduces support burden
623
+ - Establishes mdcontext as a professional tool
624
+
625
+ **Implementation outline**:
626
+
627
+ - Add `docs/configuration.md` with:
628
+ - All config options with descriptions
629
+ - TypeScript config example
630
+ - JSON config example
631
+ - Environment variable mapping
632
+ - Precedence explanation
633
+
634
+ ---
635
+
636
+ ### 7.2 Add Configuration Section to Help Output
637
+
638
+ **Priority**: Low
639
+ **Effort**: Small
640
+ **Dependencies**: 7.1
641
+
642
+ **Description**:
643
+ Update `--help` output to mention configuration file support and point to documentation.
644
+
645
+ **Why it matters**:
646
+
647
+ - Discoverability of config features
648
+ - Consistent with other modern CLI tools
649
+
650
+ **Implementation outline**:
651
+
652
+ ```
653
+ CONFIGURATION
654
+ mdcontext reads configuration from (in order of precedence):
655
+ 1. CLI flags
656
+ 2. Environment variables (MDCONTEXT_*)
657
+ 3. Config file (mdcontext.config.ts or .mdcontextrc)
658
+ 4. Built-in defaults
659
+
660
+ Run "mdcontext config init" to create a config file.
661
+ See https://github.com/user/mdcontext#configuration for details.
662
+ ```
663
+
664
+ ---
665
+
666
+ ## Summary: Implementation Order
667
+
668
+ | Phase | Tasks | Total Effort | Priority |
669
+ | ---------------------------- | ------------- | ------------ | ----------- |
670
+ | **1. Foundation** | 1.1, 1.2, 1.3 | Medium | High |
671
+ | **2. CLI Integration** | 2.1, 2.2, 2.3 | Medium | High/Medium |
672
+ | **3. Environment Variables** | 3.1, 3.2 | Small | Medium |
673
+ | **4. Validation** | 4.1, 4.2 | Medium | High/Low |
674
+ | **5. Type Safety** | 5.1, 5.2 | Medium | Medium/Low |
675
+ | **6. Testing** | 6.1, 6.2 | Medium | Medium |
676
+ | **7. Documentation** | 7.1, 7.2 | Medium | High/Low |
677
+
678
+ **Recommended MVP**: Tasks 1.1, 1.2, 1.3, 2.1, 4.1, 7.1
679
+
680
+ This provides:
681
+
682
+ - Working config file support
683
+ - CLI integration
684
+ - Good error messages
685
+ - Documentation
686
+
687
+ Everything else can be added incrementally.
688
+
689
+ ---
690
+
691
+ ## Dependencies Graph
692
+
693
+ ```
694
+ 1.1 (Schema) ─────┬─► 1.2 (defineConfig) ─► 1.3 (Loader) ─► 2.1 (CLI Integration)
695
+ │ │
696
+ │ ├─► 2.2 (--config flag)
697
+ │ │
698
+ ├─► 3.1 (Env Vars) ◄─────────────────────┘
699
+
700
+ ├─► 4.1 (Validation Errors) ─► 4.2 (config check)
701
+
702
+ ├─► 5.2 (JSON Schema)
703
+
704
+ └─► 7.1 (Documentation)
705
+
706
+ 1.3 (Loader) ─────┬─► 5.1 (Effect Layer) ─► 6.1 (Test Utils) ─► 6.2 (Integration Tests)
707
+
708
+ └─► 2.3 (config init)
709
+
710
+ 3.2 (Redacted) ──── (Independent)
711
+ ```
712
+
713
+ ---
714
+
715
+ _Created: 2026-01-21_