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,470 @@
1
+ # Current Configuration Implementation Analysis
2
+
3
+ ## Overview
4
+
5
+ The mdcontext codebase currently has a **minimal, decentralized approach** to configuration. There is no centralized configuration system - configuration is handled through CLI arguments, environment variables, and hardcoded constants.
6
+
7
+ ---
8
+
9
+ ## 1. CLI Argument Handling
10
+
11
+ ### Framework: @effect/cli
12
+
13
+ The CLI uses `@effect/cli` for argument parsing, with a custom preprocessor for flexible flag positioning.
14
+
15
+ **Location:** `/Users/alphab/Dev/LLM/DEV/mdcontext/src/cli/main.ts`
16
+
17
+ ```typescript
18
+ import { CliConfig, Command } from "@effect/cli";
19
+
20
+ const mainCommand = Command.make("mdcontext").pipe(
21
+ Command.withDescription("Token-efficient markdown analysis for LLMs"),
22
+ Command.withSubcommands([
23
+ indexCommand,
24
+ searchCommand,
25
+ contextCommand,
26
+ treeCommand,
27
+ linksCommand,
28
+ backlinksCommand,
29
+ statsCommand,
30
+ ]),
31
+ );
32
+
33
+ const cli = Command.run(mainCommand, {
34
+ name: "mdcontext",
35
+ version: "0.1.0", // Hardcoded version
36
+ });
37
+ ```
38
+
39
+ ### Per-Command Options Pattern
40
+
41
+ Each command defines its own options inline using `Options` from `@effect/cli`.
42
+
43
+ **Location:** `/Users/alphab/Dev/LLM/DEV/mdcontext/src/cli/commands/context.ts`
44
+
45
+ ```typescript
46
+ export const contextCommand = Command.make(
47
+ "context",
48
+ {
49
+ files: Args.file({ name: "files" }).pipe(
50
+ Args.withDescription("Markdown file(s) to summarize"),
51
+ Args.repeated,
52
+ ),
53
+ tokens: Options.integer("tokens").pipe(
54
+ Options.withAlias("t"),
55
+ Options.withDescription("Token budget"),
56
+ Options.withDefault(2000), // Default hardcoded here
57
+ ),
58
+ brief: Options.boolean("brief").pipe(
59
+ Options.withDescription("Minimal output"),
60
+ Options.withDefault(false),
61
+ ),
62
+ // ... more options
63
+ },
64
+ ({ files, tokens, brief, full, section, sections, shallow, json, pretty }) =>
65
+ Effect.gen(function* () {
66
+ // Handler uses destructured options directly
67
+ }),
68
+ );
69
+ ```
70
+
71
+ ### Shared Options
72
+
73
+ Common options are defined in a separate file.
74
+
75
+ **Location:** `/Users/alphab/Dev/LLM/DEV/mdcontext/src/cli/options.ts`
76
+
77
+ ```typescript
78
+ export const jsonOption = Options.boolean("json").pipe(
79
+ Options.withDescription("Output as JSON"),
80
+ Options.withDefault(false),
81
+ );
82
+
83
+ export const prettyOption = Options.boolean("pretty").pipe(
84
+ Options.withDescription("Pretty-print JSON output"),
85
+ Options.withDefault(true),
86
+ );
87
+
88
+ export const forceOption = Options.boolean("force").pipe(
89
+ Options.withDescription("Force full rebuild, ignoring cache"),
90
+ Options.withDefault(false),
91
+ );
92
+ ```
93
+
94
+ ### Flag Schemas (for validation/preprocessing)
95
+
96
+ A separate schema system exists for unknown flag detection and typo suggestions.
97
+
98
+ **Location:** `/Users/alphab/Dev/LLM/DEV/mdcontext/src/cli/flag-schemas.ts`
99
+
100
+ ```typescript
101
+ export interface FlagSpec {
102
+ name: string;
103
+ type: FlagType; // 'boolean' | 'string'
104
+ alias?: string;
105
+ description?: string;
106
+ }
107
+
108
+ export const searchSchema: CommandSchema = {
109
+ name: "search",
110
+ flags: [
111
+ {
112
+ name: "keyword",
113
+ type: "boolean",
114
+ alias: "k",
115
+ description: "Force keyword search",
116
+ },
117
+ {
118
+ name: "limit",
119
+ type: "string",
120
+ alias: "n",
121
+ description: "Maximum results",
122
+ },
123
+ // ...
124
+ ],
125
+ };
126
+
127
+ export const commandSchemas: Record<string, CommandSchema> = {
128
+ index: indexSchema,
129
+ search: searchSchema,
130
+ context: contextSchema,
131
+ // ...
132
+ };
133
+ ```
134
+
135
+ ---
136
+
137
+ ## 2. Environment Variable Usage
138
+
139
+ ### Current Usage
140
+
141
+ Only **one environment variable** is used in the entire codebase:
142
+
143
+ **Location:** `/Users/alphab/Dev/LLM/DEV/mdcontext/src/embeddings/openai-provider.ts`
144
+
145
+ ```typescript
146
+ export class OpenAIProvider implements EmbeddingProvider {
147
+ constructor(options: OpenAIProviderOptions = {}) {
148
+ const apiKey = options.apiKey ?? process.env.OPENAI_API_KEY;
149
+ if (!apiKey) {
150
+ throw new MissingApiKeyError();
151
+ }
152
+ // ...
153
+ }
154
+ }
155
+ ```
156
+
157
+ **Location:** `/Users/alphab/Dev/LLM/DEV/mdcontext/src/cli/commands/index-cmd.ts`
158
+
159
+ ```typescript
160
+ // Direct env check for user prompt
161
+ if (!process.env.OPENAI_API_KEY) {
162
+ yield * Console.log("OPENAI_API_KEY not set.");
163
+ // ...
164
+ }
165
+ ```
166
+
167
+ ### Missing Environment Variable Support
168
+
169
+ Currently no support for:
170
+
171
+ - `.env` file loading (mentioned in help text but not implemented)
172
+ - Configurable defaults via env vars
173
+ - Other API providers or configuration
174
+
175
+ ---
176
+
177
+ ## 3. Existing Config Files
178
+
179
+ ### Per-Index Configuration
180
+
181
+ When an index is created, a config file is stored in `.mdcontext/config.json`.
182
+
183
+ **Location:** `/Users/alphab/Dev/LLM/DEV/mdcontext/src/index/types.ts`
184
+
185
+ ```typescript
186
+ export interface IndexConfig {
187
+ readonly version: number;
188
+ readonly rootPath: string;
189
+ readonly include: readonly string[];
190
+ readonly exclude: readonly string[];
191
+ readonly createdAt: string;
192
+ readonly updatedAt: string;
193
+ }
194
+
195
+ export const INDEX_DIR = ".mdcontext";
196
+ export const INDEX_VERSION = 1;
197
+
198
+ export const getIndexPaths = (rootPath: string) => ({
199
+ root: `${rootPath}/${INDEX_DIR}`,
200
+ config: `${rootPath}/${INDEX_DIR}/config.json`,
201
+ documents: `${rootPath}/${INDEX_DIR}/indexes/documents.json`,
202
+ sections: `${rootPath}/${INDEX_DIR}/indexes/sections.json`,
203
+ links: `${rootPath}/${INDEX_DIR}/indexes/links.json`,
204
+ cache: `${rootPath}/${INDEX_DIR}/cache`,
205
+ parsed: `${rootPath}/${INDEX_DIR}/cache/parsed`,
206
+ });
207
+ ```
208
+
209
+ **Location:** `/Users/alphab/Dev/LLM/DEV/mdcontext/src/index/storage.ts`
210
+
211
+ ```typescript
212
+ export const initializeIndex = (
213
+ storage: IndexStorage,
214
+ ): Effect.Effect<void, Error> =>
215
+ Effect.gen(function* () {
216
+ yield* ensureDir(storage.paths.root);
217
+ // ...
218
+ const existingConfig = yield* loadConfig(storage);
219
+ if (!existingConfig) {
220
+ const config: IndexConfig = {
221
+ version: INDEX_VERSION,
222
+ rootPath: storage.rootPath,
223
+ include: ["**/*.md", "**/*.mdx"], // Hardcoded defaults
224
+ exclude: ["**/node_modules/**", "**/.*/**"], // Hardcoded defaults
225
+ createdAt: new Date().toISOString(),
226
+ updatedAt: new Date().toISOString(),
227
+ };
228
+ yield* saveConfig(storage, config);
229
+ }
230
+ });
231
+ ```
232
+
233
+ ### No Global User Config
234
+
235
+ There is **no** support for:
236
+
237
+ - `~/.mdcontextrc` or similar user-level config
238
+ - `.mdcontextrc` in project root
239
+ - `mdcontext.config.js` or `mdcontext.config.ts`
240
+ - Config section in `package.json`
241
+
242
+ ---
243
+
244
+ ## 4. How Services Receive Configuration
245
+
246
+ ### Pattern: Direct Options Passing
247
+
248
+ Services receive configuration through **function parameters**, not dependency injection or a config service.
249
+
250
+ **Location:** `/Users/alphab/Dev/LLM/DEV/mdcontext/src/index/indexer.ts`
251
+
252
+ ```typescript
253
+ export interface IndexOptions {
254
+ readonly force?: boolean;
255
+ readonly exclude?: readonly string[];
256
+ }
257
+
258
+ export const buildIndex = (
259
+ rootPath: string,
260
+ options: IndexOptions = {},
261
+ ): Effect.Effect<IndexResult, Error> =>
262
+ Effect.gen(function* () {
263
+ // Uses options directly
264
+ const exclude = options.exclude ?? ["**/node_modules/**", "**/.*/**"];
265
+ // ...
266
+ });
267
+ ```
268
+
269
+ **Location:** `/Users/alphab/Dev/LLM/DEV/mdcontext/src/summarize/summarizer.ts`
270
+
271
+ ```typescript
272
+ export interface SummarizeOptions {
273
+ readonly level?: CompressionLevel | undefined;
274
+ readonly maxTokens?: number | undefined;
275
+ }
276
+
277
+ export const summarizeFile = (
278
+ filePath: string,
279
+ options: SummarizeOptions = {},
280
+ ): Effect.Effect<DocumentSummary, Error> =>
281
+ Effect.gen(function* () {
282
+ const level = options.level ?? "summary";
283
+ const maxTokens = options.maxTokens ?? TOKEN_BUDGETS[level];
284
+ // ...
285
+ });
286
+ ```
287
+
288
+ ### Pattern: Hardcoded Constants
289
+
290
+ Many configuration values are defined as module-level constants.
291
+
292
+ **Location:** `/Users/alphab/Dev/LLM/DEV/mdcontext/src/summarize/summarizer.ts`
293
+
294
+ ```typescript
295
+ const TOKEN_BUDGETS: Record<CompressionLevel, number> = {
296
+ brief: 100,
297
+ summary: 500,
298
+ full: Infinity,
299
+ };
300
+
301
+ const MIN_SENTENCE_LENGTH = 10;
302
+ const SENTENCE_LENGTH_MIN = 50;
303
+ const SENTENCE_LENGTH_MAX = 200;
304
+ const SUMMARY_COMPRESSION_RATIO = 0.3;
305
+ const MIN_SECTION_TOKENS = 20;
306
+ // ...
307
+ ```
308
+
309
+ **Location:** `/Users/alphab/Dev/LLM/DEV/mdcontext/src/embeddings/openai-provider.ts`
310
+
311
+ ```typescript
312
+ const PRICING: Record<string, number> = {
313
+ "text-embedding-3-small": 0.02,
314
+ "text-embedding-3-large": 0.13,
315
+ "text-embedding-ada-002": 0.1,
316
+ };
317
+ ```
318
+
319
+ ### MCP Server Configuration
320
+
321
+ The MCP server receives root path from `process.cwd()`.
322
+
323
+ **Location:** `/Users/alphab/Dev/LLM/DEV/mdcontext/src/mcp/server.ts`
324
+
325
+ ```typescript
326
+ const main = async () => {
327
+ const rootPath = process.cwd(); // Hardcoded to cwd
328
+ const server = createServer(rootPath);
329
+ // ...
330
+ };
331
+ ```
332
+
333
+ ---
334
+
335
+ ## 5. Current Patterns Summary
336
+
337
+ | Aspect | Current Pattern | Location |
338
+ | ------------------ | --------------------------------- | ----------------------------------- |
339
+ | CLI options | @effect/cli with inline defaults | `src/cli/commands/*.ts` |
340
+ | Shared CLI options | Separate module | `src/cli/options.ts` |
341
+ | Flag validation | Separate schema registry | `src/cli/flag-schemas.ts` |
342
+ | Environment vars | Direct `process.env` access | `src/embeddings/openai-provider.ts` |
343
+ | Per-index config | JSON file in `.mdcontext/` | `src/index/storage.ts` |
344
+ | Service config | Function parameters with defaults | Various service files |
345
+ | Hardcoded values | Module-level constants | Throughout codebase |
346
+ | Global user config | **Not implemented** | N/A |
347
+
348
+ ---
349
+
350
+ ## 6. What Works Well
351
+
352
+ 1. **Type Safety**: All options have TypeScript types through `@effect/cli`
353
+ 2. **Validation**: CLI validates options with good error messages
354
+ 3. **Defaults**: Sensible defaults are provided at definition point
355
+ 4. **Separation**: Shared options are centralized in `options.ts`
356
+ 5. **Schema Registry**: Flag schemas enable typo detection and suggestions
357
+ 6. **Simplicity**: No complex config loading or merging logic
358
+
359
+ ---
360
+
361
+ ## 7. Limitations and Pain Points
362
+
363
+ ### 7.1 No Configuration File Support
364
+
365
+ - Users cannot set persistent defaults
366
+ - Every CLI invocation requires explicit flags
367
+ - No way to configure project-specific settings
368
+ - Help text mentions `.env` but it's not implemented
369
+
370
+ ### 7.2 Duplicated Default Values
371
+
372
+ Defaults are scattered across multiple locations:
373
+
374
+ - `Options.withDefault(2000)` in context command
375
+ - `TOKEN_BUDGETS` constant in summarizer
376
+ - `['**/node_modules/**', '**/.*/**']` appears in multiple files
377
+
378
+ ### 7.3 No Configuration Hierarchy
379
+
380
+ Missing support for:
381
+
382
+ - User-level defaults (`~/.mdcontextrc`)
383
+ - Project-level config (`.mdcontextrc` or `mdcontext.config.ts`)
384
+ - Environment variable overrides
385
+ - CLI flag overrides
386
+
387
+ ### 7.4 Services Have No Config Awareness
388
+
389
+ Services like `summarizer.ts` cannot access:
390
+
391
+ - User preferences
392
+ - Project configuration
393
+ - Environment-specific settings
394
+
395
+ ### 7.5 Version Hardcoding
396
+
397
+ Version `'0.1.0'` is hardcoded in:
398
+
399
+ - `src/cli/main.ts`
400
+ - `src/mcp/server.ts`
401
+
402
+ ### 7.6 Inconsistent Option Handling
403
+
404
+ - Some options use `Option` type (from Effect): `section._tag === 'Some'`
405
+ - Some use primitive types with `undefined`
406
+ - No unified pattern for optional values
407
+
408
+ ### 7.7 Environment Variable Limitations
409
+
410
+ - Only `OPENAI_API_KEY` is supported
411
+ - No `.env` file loading
412
+ - No configuration for:
413
+ - Default model
414
+ - Default token budgets
415
+ - Default search thresholds
416
+ - Index location customization
417
+
418
+ ---
419
+
420
+ ## 8. Configuration Debt
421
+
422
+ ### Files That Would Benefit From Config
423
+
424
+ | File | Hardcoded Values |
425
+ | ------------------------ | --------------------------------------------------- |
426
+ | `summarizer.ts` | TOKEN_BUDGETS, compression ratios, sentence lengths |
427
+ | `openai-provider.ts` | Model name, batch size, pricing |
428
+ | `searcher.ts` | Default context lines, limit |
429
+ | `indexer.ts` | Exclude patterns |
430
+ | `main.ts` | Version string |
431
+ | `mcp/server.ts` | Version string, tool defaults |
432
+ | `cli/commands/search.ts` | AUTO_INDEX_THRESHOLD_SECONDS (10) |
433
+
434
+ ### Configurable Values Currently Hardcoded
435
+
436
+ ```typescript
437
+ // Should be configurable:
438
+ const AUTO_INDEX_THRESHOLD_SECONDS = 10;
439
+ const DEFAULT_TOKEN_BUDGET = 2000;
440
+ const DEFAULT_SEARCH_LIMIT = 10;
441
+ const DEFAULT_SIMILARITY_THRESHOLD = 0.45;
442
+ const DEFAULT_EMBEDDING_MODEL = "text-embedding-3-small";
443
+ const DEFAULT_EXCLUDE_PATTERNS = ["**/node_modules/**", "**/.*/**"];
444
+ ```
445
+
446
+ ---
447
+
448
+ ## 9. Recommendations for Migration
449
+
450
+ 1. **Create Config Module**: Centralize all configuration in a single module
451
+ 2. **Implement Config Hierarchy**: Support file < env < CLI precedence
452
+ 3. **Use Effect Config**: Leverage `@effect/cli` ConfigProvider for consistency
453
+ 4. **Extract Constants**: Move hardcoded values to configuration
454
+ 5. **Add .env Support**: Implement dotenv loading for environment variables
455
+ 6. **Version from package.json**: Read version dynamically
456
+
457
+ ---
458
+
459
+ ## 10. Files to Modify for Config Migration
460
+
461
+ | Priority | File | Changes Needed |
462
+ | -------- | ----------------------------------- | --------------------------------------------- |
463
+ | High | `src/cli/main.ts` | Add config loading, version from package.json |
464
+ | High | `src/cli/commands/*.ts` | Read defaults from config |
465
+ | High | `src/embeddings/openai-provider.ts` | Use config for model, API key |
466
+ | Medium | `src/summarize/summarizer.ts` | Make constants configurable |
467
+ | Medium | `src/index/indexer.ts` | Use config for exclude patterns |
468
+ | Medium | `src/search/searcher.ts` | Use config for defaults |
469
+ | Medium | `src/mcp/server.ts` | Version from package.json |
470
+ | Low | `src/cli/flag-schemas.ts` | Consider auto-generation from config |