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,588 @@
1
+ /**
2
+ * Custom help system for mdcontext CLI
3
+ *
4
+ * Provides beautiful, useful help output that matches the quality of
5
+ * professional CLI tools like git and gh.
6
+ */
7
+
8
+ // ============================================================================
9
+ // Types
10
+ // ============================================================================
11
+
12
+ interface CommandHelp {
13
+ description: string
14
+ usage: string
15
+ examples: string[]
16
+ options: { name: string; description: string }[]
17
+ notes?: string[]
18
+ }
19
+
20
+ // ============================================================================
21
+ // Help Content
22
+ // ============================================================================
23
+
24
+ export const helpContent: Record<string, CommandHelp> = {
25
+ index: {
26
+ description: 'Index markdown files for fast searching',
27
+ usage: 'mdcontext index [path] [options]',
28
+ examples: [
29
+ 'mdcontext index # Index current directory',
30
+ 'mdcontext index docs/ # Index specific directory',
31
+ 'mdcontext index --embed # Include semantic embeddings',
32
+ 'mdcontext index --watch # Watch for file changes',
33
+ 'mdcontext index --embed --watch # Full setup with live updates',
34
+ 'mdcontext index --force # Rebuild from scratch',
35
+ '',
36
+ '# Alternative embedding providers:',
37
+ 'mdcontext index --embed --provider ollama --provider-model nomic-embed-text',
38
+ 'mdcontext index --embed --provider openrouter',
39
+ ],
40
+ options: [
41
+ {
42
+ name: '-e, --embed',
43
+ description: 'Build semantic embeddings (enables AI-powered search)',
44
+ },
45
+ {
46
+ name: '--no-embed',
47
+ description: 'Skip the prompt to enable semantic search',
48
+ },
49
+ {
50
+ name: '--provider <name>',
51
+ description:
52
+ 'Embedding provider: openai, ollama, lm-studio, openrouter, voyage',
53
+ },
54
+ {
55
+ name: '--provider-model <model>',
56
+ description: 'Model name (e.g., nomic-embed-text for Ollama)',
57
+ },
58
+ {
59
+ name: '--provider-base-url <url>',
60
+ description: 'Custom API base URL for the provider',
61
+ },
62
+ {
63
+ name: '-t, --timeout <ms>',
64
+ description: 'Embedding API timeout in milliseconds (default: 30000)',
65
+ },
66
+ {
67
+ name: '-w, --watch',
68
+ description: 'Watch for changes and re-index automatically',
69
+ },
70
+ { name: '--force', description: 'Rebuild from scratch, ignoring cache' },
71
+ { name: '--json', description: 'Output results as JSON' },
72
+ { name: '--pretty', description: 'Pretty-print JSON output' },
73
+ ],
74
+ notes: [
75
+ 'After indexing, prompts to enable semantic search (use --no-embed to skip).',
76
+ 'Providers: openai (default), ollama (free/local), lm-studio, openrouter, voyage.',
77
+ 'Set API keys: OPENAI_API_KEY, OPENROUTER_API_KEY, or use local providers.',
78
+ 'Index is stored in .mdcontext/ directory.',
79
+ ],
80
+ },
81
+ search: {
82
+ description: 'Search markdown content by meaning or heading pattern',
83
+ usage: 'mdcontext search [options] <query> [path]',
84
+ examples: [
85
+ 'mdcontext search "auth" # Simple term search',
86
+ 'mdcontext search "auth AND deploy" # Both terms required',
87
+ 'mdcontext search "error OR bug" # Either term matches',
88
+ 'mdcontext search "impl NOT test" # Exclude "test"',
89
+ 'mdcontext search "auth AND (error OR bug)" # Grouped expressions',
90
+ 'mdcontext search \'"exact phrase"\' # Exact phrase match',
91
+ 'mdcontext search \'"context resumption" AND drift\' # Phrase + boolean',
92
+ 'mdcontext search -H "API.*" # Regex on headings only',
93
+ 'mdcontext search --mode keyword "auth" # Force keyword mode',
94
+ 'mdcontext search --mode semantic "auth" # Force semantic mode',
95
+ 'mdcontext search -n 5 "setup" # Limit to 5 results',
96
+ 'mdcontext search "config" docs/ # Search in specific directory',
97
+ '',
98
+ '# Context lines (like grep):',
99
+ 'mdcontext search "checkpoint" -C 3 # 3 lines before AND after',
100
+ 'mdcontext search "error" -B 2 -A 5 # 2 before, 5 after',
101
+ '',
102
+ '# Quality modes (speed vs recall tradeoff):',
103
+ 'mdcontext search "auth" --quality fast # Faster, slight recall reduction',
104
+ 'mdcontext search "auth" -q thorough # Best recall, ~30% slower',
105
+ '',
106
+ '# Re-ranking for precision:',
107
+ 'mdcontext search "auth" --rerank # Re-rank with cross-encoder',
108
+ '',
109
+ '# HyDE for complex queries:',
110
+ 'mdcontext search "how to implement auth" --hyde # Expands query semantically',
111
+ '',
112
+ '# AI summarization:',
113
+ 'mdcontext search "auth" --summarize # Get AI summary of results',
114
+ 'mdcontext search "error" -s --yes # Skip cost confirmation',
115
+ 'mdcontext search "config" -s --stream # Stream summary output',
116
+ ],
117
+ options: [
118
+ {
119
+ name: '-k, --keyword',
120
+ description: 'Force keyword search (content text match)',
121
+ },
122
+ {
123
+ name: '-H, --heading-only',
124
+ description: 'Search headings only (not content)',
125
+ },
126
+ {
127
+ name: '-m, --mode <mode>',
128
+ description: 'Force search mode: semantic, keyword, or hybrid',
129
+ },
130
+ {
131
+ name: '-n, --limit <n>',
132
+ description: 'Maximum number of results (default: 10)',
133
+ },
134
+ {
135
+ name: '-C <n>',
136
+ description: 'Show N context lines before AND after each match',
137
+ },
138
+ {
139
+ name: '-B <n>',
140
+ description: 'Show N context lines before each match',
141
+ },
142
+ {
143
+ name: '-A <n>',
144
+ description: 'Show N context lines after each match',
145
+ },
146
+ {
147
+ name: '--threshold <n>',
148
+ description:
149
+ 'Similarity threshold 0-1 for semantic search (default: 0.35)',
150
+ },
151
+ {
152
+ name: '--provider <name>',
153
+ description: 'Embedding provider for semantic search',
154
+ },
155
+ {
156
+ name: '--timeout <ms>',
157
+ description: 'Embedding API timeout in milliseconds (default: 30000)',
158
+ },
159
+ {
160
+ name: '-r, --rerank',
161
+ description:
162
+ 'Re-rank results with cross-encoder for better precision. Downloads ~90MB model on first use.',
163
+ },
164
+ {
165
+ name: '--rerank-init',
166
+ description:
167
+ 'Pre-download cross-encoder model (~90MB) before first search to avoid latency.',
168
+ },
169
+ {
170
+ name: '-q, --quality <mode>',
171
+ description:
172
+ 'Search quality: fast (quicker), balanced (default), thorough (best recall)',
173
+ },
174
+ {
175
+ name: '--hyde',
176
+ description:
177
+ 'Use HyDE query expansion for complex queries. Improves recall 10-30% at cost of ~1-2s latency.',
178
+ },
179
+ { name: '--json', description: 'Output results as JSON' },
180
+ { name: '--pretty', description: 'Pretty-print JSON output' },
181
+ {
182
+ name: '-s, --summarize',
183
+ description: 'Generate AI summary of search results',
184
+ },
185
+ {
186
+ name: '-y, --yes',
187
+ description: 'Skip cost confirmation for paid AI providers',
188
+ },
189
+ {
190
+ name: '--stream',
191
+ description: 'Stream AI summary output in real-time',
192
+ },
193
+ ],
194
+ notes: [
195
+ 'Auto-detects mode: semantic if embeddings exist, keyword otherwise.',
196
+ 'Boolean operators: AND, OR, NOT (case-insensitive).',
197
+ 'Quoted phrases match exactly: "context resumption".',
198
+ 'Regex patterns (e.g., "API.*") always use keyword search.',
199
+ 'Run "mdcontext index --embed" first for semantic search.',
200
+ '',
201
+ 'Similarity threshold (--threshold):',
202
+ ' Default: 0.35 (35%). Results below this similarity are filtered out.',
203
+ ' If 0 results: content may exist below threshold. Try --threshold 0.25.',
204
+ ' Typical scores: single words ~30-40%, phrases ~50-70%.',
205
+ ' Higher threshold = stricter matching. Lower = more results.',
206
+ '',
207
+ 'Re-ranking (--rerank):',
208
+ ' Cross-encoder model improves precision by 20-35%.',
209
+ ' Requires: npm install @huggingface/transformers',
210
+ ' Model is downloaded on first use (~90MB) and cached locally.',
211
+ ' Use --rerank-init to pre-download and avoid latency on first search.',
212
+ '',
213
+ 'Quality modes (--quality):',
214
+ ' fast: efSearch=64, ~40% faster, slight recall reduction.',
215
+ ' balanced: efSearch=100 (default), good balance of speed and recall.',
216
+ ' thorough: efSearch=256, ~30% slower, best recall for large corpora.',
217
+ '',
218
+ 'HyDE (--hyde):',
219
+ ' Generates hypothetical document using LLM, searches with that embedding.',
220
+ ' Best for: "how to" questions, complex queries, ambiguous searches.',
221
+ ' Requires: OPENAI_API_KEY (uses gpt-4o-mini by default).',
222
+ ' Adds ~1-2s latency, improves recall 10-30% on complex queries.',
223
+ ],
224
+ },
225
+ context: {
226
+ description: 'Get LLM-ready summary of markdown files',
227
+ usage: 'mdcontext context [options] <files>...',
228
+ examples: [
229
+ 'mdcontext context README.md # Summarize single file',
230
+ 'mdcontext context *.md # Summarize all markdown files',
231
+ 'mdcontext context -t 1000 *.md # Fit within 1000 token budget',
232
+ 'mdcontext context --brief *.md # Minimal output (headings only)',
233
+ 'mdcontext context --full doc.md # Include full content',
234
+ 'mdcontext context *.md | pbcopy # Copy to clipboard (macOS)',
235
+ '',
236
+ '# Section filtering:',
237
+ 'mdcontext context doc.md --sections # List available sections',
238
+ 'mdcontext context doc.md --section "Setup" # Extract by section name',
239
+ 'mdcontext context doc.md --section "2.1" # Extract by section number',
240
+ 'mdcontext context doc.md --section "API*" # Glob pattern matching',
241
+ 'mdcontext context doc.md --section "Config" --shallow # Top-level only',
242
+ '',
243
+ '# Section exclusion:',
244
+ 'mdcontext context doc.md --exclude "License" # Exclude License section',
245
+ 'mdcontext context doc.md -x "License" -x "Test*" # Multiple exclusions',
246
+ ],
247
+ options: [
248
+ {
249
+ name: '-t, --tokens <n>',
250
+ description: 'Token budget for output (default: 2000)',
251
+ },
252
+ {
253
+ name: '--brief',
254
+ description: 'Minimal output (headings and key points only)',
255
+ },
256
+ {
257
+ name: '--full',
258
+ description: 'Include full content (no summarization)',
259
+ },
260
+ {
261
+ name: '--section <name>',
262
+ description:
263
+ 'Extract specific section by name, number, or glob pattern',
264
+ },
265
+ {
266
+ name: '--sections',
267
+ description: 'List available sections with numbers and token counts',
268
+ },
269
+ {
270
+ name: '--shallow',
271
+ description: 'Exclude nested subsections when using --section',
272
+ },
273
+ {
274
+ name: '-x, --exclude <pattern>',
275
+ description: 'Exclude sections by name, number, or glob (repeatable)',
276
+ },
277
+ { name: '--json', description: 'Output as JSON' },
278
+ { name: '--pretty', description: 'Pretty-print JSON output' },
279
+ ],
280
+ notes: [
281
+ 'Token budget controls how much content is included.',
282
+ 'Lower tokens = more aggressive summarization.',
283
+ 'Output is formatted for direct use in LLM prompts.',
284
+ 'Use --sections to discover section names before filtering.',
285
+ 'Exclusion: -x matches by heading name, section number, or glob pattern.',
286
+ ],
287
+ },
288
+ tree: {
289
+ description: 'Show file tree or document outline',
290
+ usage: 'mdcontext tree [path] [options]',
291
+ examples: [
292
+ 'mdcontext tree # List markdown files in current dir',
293
+ 'mdcontext tree docs/ # List files in specific directory',
294
+ 'mdcontext tree README.md # Show document outline (headings)',
295
+ 'mdcontext tree doc.md --json # Outline as JSON',
296
+ ],
297
+ options: [
298
+ { name: '--json', description: 'Output as JSON' },
299
+ { name: '--pretty', description: 'Pretty-print JSON output' },
300
+ ],
301
+ notes: [
302
+ 'Pass a directory to list markdown files.',
303
+ 'Pass a file to show its heading structure with token counts.',
304
+ ],
305
+ },
306
+ links: {
307
+ description: 'Show what a file links to (outgoing links)',
308
+ usage: 'mdcontext links <file> [options]',
309
+ examples: [
310
+ 'mdcontext links README.md # Show outgoing links',
311
+ 'mdcontext links doc.md --json # Output as JSON',
312
+ 'mdcontext links doc.md -r docs/ # Resolve links relative to docs/',
313
+ ],
314
+ options: [
315
+ {
316
+ name: '-r, --root <dir>',
317
+ description: 'Root directory for resolving relative links',
318
+ },
319
+ { name: '--json', description: 'Output as JSON' },
320
+ { name: '--pretty', description: 'Pretty-print JSON output' },
321
+ ],
322
+ },
323
+ backlinks: {
324
+ description: 'Show what links to a file (incoming links)',
325
+ usage: 'mdcontext backlinks <file> [options]',
326
+ examples: [
327
+ 'mdcontext backlinks api.md # What links to api.md?',
328
+ 'mdcontext backlinks doc.md --json # Output as JSON',
329
+ 'mdcontext backlinks doc.md -r ./ # Resolve from current directory',
330
+ ],
331
+ options: [
332
+ {
333
+ name: '-r, --root <dir>',
334
+ description: 'Root directory for resolving relative links',
335
+ },
336
+ { name: '--json', description: 'Output as JSON' },
337
+ { name: '--pretty', description: 'Pretty-print JSON output' },
338
+ ],
339
+ notes: ['Requires index to exist. Run "mdcontext index" first.'],
340
+ },
341
+ stats: {
342
+ description: 'Show index statistics',
343
+ usage: 'mdcontext stats [path] [options]',
344
+ examples: [
345
+ 'mdcontext stats # Show stats for current directory',
346
+ 'mdcontext stats docs/ # Show stats for specific directory',
347
+ 'mdcontext stats --json # Output as JSON',
348
+ ],
349
+ options: [
350
+ { name: '--json', description: 'Output as JSON' },
351
+ { name: '--pretty', description: 'Pretty-print JSON output' },
352
+ ],
353
+ notes: ['Shows embedding count, dimensions, and cost if embeddings exist.'],
354
+ },
355
+ config: {
356
+ description: 'Configuration management',
357
+ usage: 'mdcontext config <command> [options]',
358
+ examples: [
359
+ 'mdcontext config init # Create a starter config file',
360
+ 'mdcontext config init --format json # Create JSON config instead of JS',
361
+ 'mdcontext config show # Show config file location',
362
+ 'mdcontext config check # Validate and show effective config',
363
+ 'mdcontext config check --json # Output config as JSON',
364
+ ],
365
+ options: [
366
+ { name: 'init', description: 'Create a starter config file' },
367
+ { name: 'show', description: 'Display config file location' },
368
+ {
369
+ name: 'check',
370
+ description: 'Validate and show effective configuration',
371
+ },
372
+ {
373
+ name: '-f, --format <format>',
374
+ description: 'Config format: js or json (init only)',
375
+ },
376
+ { name: '--force', description: 'Overwrite existing config (init only)' },
377
+ { name: '--json', description: 'Output as JSON' },
378
+ { name: '--pretty', description: 'Pretty-print JSON output' },
379
+ ],
380
+ notes: [
381
+ 'Config files set persistent defaults for all commands.',
382
+ 'Precedence: CLI flags > environment > config file > defaults.',
383
+ 'See docs/CONFIG.md for full configuration reference.',
384
+ ],
385
+ },
386
+ embeddings: {
387
+ description: 'Manage embedding namespaces',
388
+ usage: 'mdcontext embeddings <command> [options]',
389
+ examples: [
390
+ 'mdcontext embeddings list # List all embedding namespaces',
391
+ 'mdcontext embeddings current # Show active namespace',
392
+ 'mdcontext embeddings switch openai # Switch to OpenAI embeddings',
393
+ 'mdcontext embeddings switch voyage # Switch to Voyage embeddings',
394
+ 'mdcontext embeddings remove ollama # Remove Ollama embeddings',
395
+ 'mdcontext embeddings remove openai -f # Force remove active namespace',
396
+ ],
397
+ options: [
398
+ { name: 'list', description: 'List all available embedding namespaces' },
399
+ { name: 'current', description: 'Show the current active namespace' },
400
+ {
401
+ name: 'switch <namespace>',
402
+ description: 'Switch to a different namespace',
403
+ },
404
+ { name: 'remove <namespace>', description: 'Remove a namespace' },
405
+ { name: '-f, --force', description: 'Force remove active namespace' },
406
+ { name: '--json', description: 'Output as JSON' },
407
+ { name: '--pretty', description: 'Pretty-print JSON output' },
408
+ ],
409
+ notes: [
410
+ 'Namespaces store embeddings separately by provider/model.',
411
+ 'Switching namespaces is instant - no rebuild required.',
412
+ 'Run "mdcontext index --embed" to create embeddings for a provider.',
413
+ ],
414
+ },
415
+ }
416
+
417
+ // ============================================================================
418
+ // Help Rendering
419
+ // ============================================================================
420
+
421
+ /**
422
+ * Render beautiful subcommand help
423
+ */
424
+ export const showSubcommandHelp = (command: string): void => {
425
+ const help = helpContent[command]
426
+ if (!help) {
427
+ console.log(`Unknown command: ${command}`)
428
+ console.log('Run "mdcontext --help" for available commands.')
429
+ process.exit(1)
430
+ }
431
+
432
+ // Header
433
+ console.log(`\n\x1b[1mmdcontext ${command}\x1b[0m - ${help.description}`)
434
+
435
+ // Usage
436
+ console.log(`\n\x1b[33mUSAGE\x1b[0m`)
437
+ console.log(` ${help.usage}`)
438
+
439
+ // Examples
440
+ console.log(`\n\x1b[33mEXAMPLES\x1b[0m`)
441
+ for (const example of help.examples) {
442
+ console.log(` ${example}`)
443
+ }
444
+
445
+ // Options
446
+ console.log(`\n\x1b[33mOPTIONS\x1b[0m`)
447
+ for (const opt of help.options) {
448
+ // Pad option name to 24 chars for alignment
449
+ const paddedName = opt.name.padEnd(24)
450
+ console.log(` ${paddedName}${opt.description}`)
451
+ }
452
+
453
+ // Notes (if any)
454
+ if (help.notes && help.notes.length > 0) {
455
+ console.log(`\n\x1b[33mNOTES\x1b[0m`)
456
+ for (const note of help.notes) {
457
+ console.log(` ${note}`)
458
+ }
459
+ }
460
+
461
+ console.log('')
462
+ }
463
+
464
+ /**
465
+ * Custom help output for main command - beautiful and useful
466
+ */
467
+ export const showMainHelp = (): void => {
468
+ const help = `
469
+ \x1b[1mmdcontext\x1b[0m - Token-efficient markdown analysis for LLMs
470
+
471
+ \x1b[33mCOMMANDS\x1b[0m
472
+ index [path] Index markdown files (default: .)
473
+ search <query> [path] Search by meaning or structure
474
+ context <files>... Get LLM-ready summary
475
+ tree [path] Show files or document outline
476
+ config <command> Configuration management
477
+ embeddings <command> Manage embedding namespaces
478
+ links <file> Show outgoing links
479
+ backlinks <file> Show incoming links
480
+ stats [path] Index statistics
481
+
482
+ \x1b[33mEXAMPLES\x1b[0m
483
+ mdcontext tree # List all markdown files
484
+ mdcontext tree README.md # Show document outline
485
+ mdcontext index # Index current directory
486
+ mdcontext index --embed # Index with semantic embeddings
487
+ mdcontext search "auth" # Simple term search
488
+ mdcontext search "auth AND deploy" # Boolean AND (both required)
489
+ mdcontext search "error OR bug" # Boolean OR (either matches)
490
+ mdcontext search '"exact phrase"' # Quoted phrase (exact match)
491
+ mdcontext search "how to deploy" # Semantic search (if embeddings exist)
492
+ mdcontext context README.md # Summarize a file
493
+ mdcontext context *.md -t 2000 # Multi-file with token budget
494
+
495
+ \x1b[33mWORKFLOWS\x1b[0m
496
+ \x1b[2m# Quick context for LLM\x1b[0m
497
+ mdcontext context README.md docs/*.md | pbcopy
498
+
499
+ \x1b[2m# Find relevant documentation\x1b[0m
500
+ mdcontext search "error handling"
501
+
502
+ \x1b[2m# Complex queries with boolean operators\x1b[0m
503
+ mdcontext search "auth AND (error OR exception) NOT test"
504
+
505
+ \x1b[2m# Explore a new codebase\x1b[0m
506
+ mdcontext tree && mdcontext stats
507
+
508
+ \x1b[2m# Build semantic search\x1b[0m
509
+ mdcontext index --embed && mdcontext search "authentication flow"
510
+
511
+ \x1b[2m# Set up project configuration\x1b[0m
512
+ mdcontext config init && mdcontext config check
513
+
514
+ \x1b[33mGLOBAL OPTIONS\x1b[0m
515
+ -c, --config <file> Use specified config file
516
+ --json Output as JSON
517
+ --pretty Pretty-print JSON
518
+ --help, -h Show help
519
+ --version, -v Show version
520
+
521
+ Run \x1b[36mmdcontext <command> --help\x1b[0m for command-specific options.
522
+ `
523
+ console.log(help)
524
+ }
525
+
526
+ // ============================================================================
527
+ // Help Detection
528
+ // ============================================================================
529
+
530
+ /**
531
+ * Check for subcommand help pattern: mdcontext <cmd> --help or mdcontext <cmd> -h
532
+ * Returns true if help was shown and we should exit
533
+ */
534
+ export const checkSubcommandHelp = (): boolean => {
535
+ const args = process.argv.slice(2)
536
+ if (args.length < 2) return false
537
+
538
+ const command = args[0]
539
+ const hasHelpFlag = args.includes('--help') || args.includes('-h')
540
+
541
+ if (hasHelpFlag && command && helpContent[command]) {
542
+ showSubcommandHelp(command)
543
+ process.exit(0)
544
+ }
545
+
546
+ return false
547
+ }
548
+
549
+ /**
550
+ * Check for bare subcommand that has nested subcommands (e.g., "config", "embeddings").
551
+ * Shows custom help when running "mdcontext config" without arguments.
552
+ * This prevents the ugly Effect CLI default output.
553
+ */
554
+ export const checkBareSubcommandHelp = (): boolean => {
555
+ const args = process.argv.slice(2)
556
+
557
+ // Look for: exactly one arg that is a command with subcommands in helpContent
558
+ if (args.length !== 1) return false
559
+
560
+ const command = args[0]
561
+
562
+ // Only handle commands that have subcommands and custom help
563
+ const commandsWithSubcommands = ['config', 'embeddings']
564
+ if (
565
+ command &&
566
+ commandsWithSubcommands.includes(command) &&
567
+ helpContent[command]
568
+ ) {
569
+ showSubcommandHelp(command)
570
+ process.exit(0)
571
+ }
572
+
573
+ return false
574
+ }
575
+
576
+ /**
577
+ * Check if we should show main help
578
+ */
579
+ export const shouldShowMainHelp = (): boolean => {
580
+ const args = process.argv.slice(2)
581
+ const showHelp =
582
+ args.length === 0 ||
583
+ args.includes('--help') ||
584
+ args.includes('-h') ||
585
+ (args.length === 1 && args[0] === 'help')
586
+
587
+ return showHelp && !args.some((a) => !a.startsWith('-') && a !== 'help')
588
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * CLI module barrel export
3
+ *
4
+ * Re-exports CLI utilities for programmatic use.
5
+ * The CLI entry point is in main.ts.
6
+ */
7
+
8
+ // Currently no public exports - CLI is run directly via main.ts
9
+ // Future: export shared utilities, command builders, etc.