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.
- package/.changeset/README.md +28 -0
- package/.changeset/config.json +11 -0
- package/.claude/settings.local.json +25 -0
- package/.github/workflows/ci.yml +83 -0
- package/.github/workflows/claude-code-review.yml +44 -0
- package/.github/workflows/claude.yml +85 -0
- package/.github/workflows/release.yml +113 -0
- package/.tldrignore +112 -0
- package/BACKLOG.md +338 -0
- package/CONTRIBUTING.md +186 -0
- package/NOTES/NOTES +44 -0
- package/README.md +434 -11
- package/biome.json +36 -0
- package/cspell.config.yaml +14 -0
- package/dist/chunk-23UPXDNL.js +3044 -0
- package/dist/chunk-2W7MO2DL.js +1366 -0
- package/dist/chunk-3NUAZGMA.js +1689 -0
- package/dist/chunk-7TOWB2XB.js +366 -0
- package/dist/chunk-7XOTOADQ.js +3065 -0
- package/dist/chunk-AH2PDM2K.js +3042 -0
- package/dist/chunk-BNXWSZ63.js +3742 -0
- package/dist/chunk-BTL5DJVU.js +3222 -0
- package/dist/chunk-HDHYG7E4.js +104 -0
- package/dist/chunk-HLR4KZBP.js +3234 -0
- package/dist/chunk-IP3FRFEB.js +1045 -0
- package/dist/chunk-KHU56VDO.js +3042 -0
- package/dist/chunk-KRYIFLQR.js +88 -0
- package/dist/chunk-LBSDNLEM.js +287 -0
- package/dist/chunk-MNTQ7HCP.js +2643 -0
- package/dist/chunk-MUJELQQ6.js +1387 -0
- package/dist/chunk-MXJGMSLV.js +2199 -0
- package/dist/chunk-N6QJGC3Z.js +2636 -0
- package/dist/chunk-OBELGBPM.js +1713 -0
- package/dist/chunk-OT7R5XTA.js +3192 -0
- package/dist/chunk-P7X4RA2T.js +106 -0
- package/dist/chunk-PIDUQNC2.js +3185 -0
- package/dist/chunk-POGCDIH4.js +3187 -0
- package/dist/chunk-PSIEOQGZ.js +3043 -0
- package/dist/chunk-PVRT3IHA.js +3238 -0
- package/dist/chunk-QNN4TT23.js +1430 -0
- package/dist/chunk-RE3R45RJ.js +3042 -0
- package/dist/chunk-S7E6TFX6.js +803 -0
- package/dist/chunk-SG6GLU4U.js +1378 -0
- package/dist/chunk-SJCDV2ST.js +274 -0
- package/dist/chunk-SYE5XLF3.js +104 -0
- package/dist/chunk-T5VLYBZD.js +103 -0
- package/dist/chunk-TOQB7VWU.js +3238 -0
- package/dist/chunk-VFNMZ4ZQ.js +3228 -0
- package/dist/chunk-VVTGZNBT.js +1629 -0
- package/dist/chunk-W7Q4RFEV.js +104 -0
- package/dist/chunk-XTYYVRLO.js +3190 -0
- package/dist/chunk-Y6MDYVJD.js +3063 -0
- package/dist/cli/main.d.ts +1 -0
- package/dist/cli/main.js +5458 -0
- package/dist/index.d.ts +653 -0
- package/dist/index.js +79 -0
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.js +472 -0
- package/dist/schema-BAWSG7KY.js +22 -0
- package/dist/schema-E3QUPL26.js +20 -0
- package/dist/schema-EHL7WUT6.js +20 -0
- package/docs/019-USAGE.md +625 -0
- package/docs/020-current-implementation.md +364 -0
- package/docs/021-DOGFOODING-FINDINGS.md +175 -0
- package/docs/BACKLOG.md +80 -0
- package/docs/CONFIG.md +1123 -0
- package/docs/DESIGN.md +439 -0
- package/docs/ERRORS.md +383 -0
- package/docs/PROJECT.md +88 -0
- package/docs/ROADMAP.md +407 -0
- package/docs/summarization.md +320 -0
- package/docs/test-links.md +9 -0
- package/justfile +40 -0
- package/package.json +74 -9
- package/pnpm-workspace.yaml +5 -0
- package/research/INDEX.md +315 -0
- package/research/code-review/README.md +90 -0
- package/research/code-review/cli-error-handling-review.md +979 -0
- package/research/code-review/code-review-validation-report.md +464 -0
- package/research/code-review/main-ts-review.md +1128 -0
- package/research/config-analysis/01-current-implementation.md +470 -0
- package/research/config-analysis/02-strategy-recommendation.md +428 -0
- package/research/config-analysis/03-task-candidates.md +715 -0
- package/research/config-analysis/033-research-configuration-management.md +828 -0
- package/research/config-analysis/034-research-effect-cli-config.md +1504 -0
- package/research/config-analysis/04-consolidated-task-candidates.md +277 -0
- package/research/config-docs/SUMMARY.md +357 -0
- package/research/config-docs/TEST-RESULTS.md +776 -0
- package/research/config-docs/TODO.md +542 -0
- package/research/config-docs/analysis.md +744 -0
- package/research/config-docs/fix-validation.md +502 -0
- package/research/config-docs/help-audit.md +264 -0
- package/research/config-docs/help-system-analysis.md +890 -0
- package/research/dogfood/consolidated-tool-evaluation.md +373 -0
- package/research/dogfood/strategy-a/a-synthesis.md +184 -0
- package/research/dogfood/strategy-a/a1-docs.md +226 -0
- package/research/dogfood/strategy-a/a2-amorphic.md +156 -0
- package/research/dogfood/strategy-a/a3-llm.md +164 -0
- package/research/dogfood/strategy-b/b-synthesis.md +228 -0
- package/research/dogfood/strategy-b/b1-architecture.md +207 -0
- package/research/dogfood/strategy-b/b2-gaps.md +258 -0
- package/research/dogfood/strategy-b/b3-workflows.md +250 -0
- package/research/dogfood/strategy-c/c-synthesis.md +451 -0
- package/research/dogfood/strategy-c/c1-explorer.md +192 -0
- package/research/dogfood/strategy-c/c2-diver-memory.md +145 -0
- package/research/dogfood/strategy-c/c3-diver-control.md +148 -0
- package/research/dogfood/strategy-c/c4-diver-failure.md +151 -0
- package/research/dogfood/strategy-c/c5-diver-execution.md +221 -0
- package/research/dogfood/strategy-c/c6-diver-org.md +221 -0
- package/research/effect-cli-error-handling.md +845 -0
- package/research/effect-errors-as-values.md +943 -0
- package/research/errors-task-analysis/00-consolidated-tasks.md +207 -0
- package/research/errors-task-analysis/cli-commands-analysis.md +909 -0
- package/research/errors-task-analysis/embeddings-analysis.md +709 -0
- package/research/errors-task-analysis/index-search-analysis.md +812 -0
- package/research/frontmatter/COMMENTS-ARE-SKIPPED.md +149 -0
- package/research/frontmatter/LLM-CODE-NAVIGATION.md +276 -0
- package/research/issue-review.md +603 -0
- package/research/llm-summarization/agent-cli-tools-2026.md +1082 -0
- package/research/llm-summarization/alternative-providers-2026.md +1428 -0
- package/research/llm-summarization/anthropic-2026.md +367 -0
- package/research/llm-summarization/claude-cli-integration.md +1706 -0
- package/research/llm-summarization/cli-integration-patterns.md +3155 -0
- package/research/llm-summarization/openai-2026.md +473 -0
- package/research/llm-summarization/openai-compatible-providers-2026.md +1022 -0
- package/research/llm-summarization/opencode-cli-integration.md +1552 -0
- package/research/llm-summarization/prompt-engineering-2026.md +1426 -0
- package/research/llm-summarization/prototype-results.md +56 -0
- package/research/llm-summarization/provider-switching-patterns-2026.md +2153 -0
- package/research/llm-summarization/typescript-llm-libraries-2026.md +2436 -0
- package/research/mdcontext-error-analysis.md +521 -0
- package/research/mdcontext-pudding/00-EXECUTIVE-SUMMARY.md +282 -0
- package/research/mdcontext-pudding/01-index-embed.md +956 -0
- package/research/mdcontext-pudding/02-search-COMMANDS.md +142 -0
- package/research/mdcontext-pudding/02-search-SUMMARY.md +146 -0
- package/research/mdcontext-pudding/02-search.md +970 -0
- package/research/mdcontext-pudding/03-context.md +779 -0
- package/research/mdcontext-pudding/04-navigation-and-analytics.md +803 -0
- package/research/mdcontext-pudding/04-tree.md +704 -0
- package/research/mdcontext-pudding/05-config.md +1038 -0
- package/research/mdcontext-pudding/06-links-summary.txt +87 -0
- package/research/mdcontext-pudding/06-links.md +679 -0
- package/research/mdcontext-pudding/07-stats.md +693 -0
- package/research/mdcontext-pudding/BUG-FIX-PLAN.md +388 -0
- package/research/mdcontext-pudding/P0-BUG-VALIDATION.md +167 -0
- package/research/mdcontext-pudding/README.md +168 -0
- package/research/mdcontext-pudding/TESTING-SUMMARY.md +128 -0
- package/research/npm_publish/011-npm-workflow-research-agent2.md +792 -0
- package/research/npm_publish/012-npm-workflow-research-agent1.md +530 -0
- package/research/npm_publish/013-npm-workflow-research-agent3.md +722 -0
- package/research/npm_publish/014-npm-workflow-synthesis.md +556 -0
- package/research/npm_publish/031-npm-workflow-task-analysis.md +134 -0
- package/research/research-quality-review.md +834 -0
- package/research/semantic-search/002-research-embedding-models.md +490 -0
- package/research/semantic-search/003-research-rag-alternatives.md +523 -0
- package/research/semantic-search/004-research-vector-search.md +841 -0
- package/research/semantic-search/032-research-semantic-search.md +427 -0
- package/research/semantic-search/embedding-text-analysis.md +156 -0
- package/research/semantic-search/multi-word-failure-reproduction.md +171 -0
- package/research/semantic-search/query-processing-analysis.md +207 -0
- package/research/semantic-search/root-cause-and-solution.md +114 -0
- package/research/semantic-search/threshold-validation-report.md +69 -0
- package/research/semantic-search/vector-search-analysis.md +63 -0
- package/research/task-management-2026/00-synthesis-recommendations.md +295 -0
- package/research/task-management-2026/01-ai-workflow-tools.md +416 -0
- package/research/task-management-2026/02-agent-framework-patterns.md +476 -0
- package/research/task-management-2026/03-lightweight-file-based.md +567 -0
- package/research/task-management-2026/04-established-tools-ai-features.md +541 -0
- package/research/task-management-2026/linear/01-core-features-workflow.md +771 -0
- package/research/task-management-2026/linear/02-api-integrations.md +930 -0
- package/research/task-management-2026/linear/03-ai-features.md +368 -0
- package/research/task-management-2026/linear/04-pricing-setup.md +205 -0
- package/research/task-management-2026/linear/05-usage-patterns-best-practices.md +605 -0
- package/research/test-path-issues.md +276 -0
- package/review/ALP-76/1-error-type-design.md +962 -0
- package/review/ALP-76/2-error-handling-patterns.md +906 -0
- package/review/ALP-76/3-error-presentation.md +624 -0
- package/review/ALP-76/4-test-coverage.md +625 -0
- package/review/ALP-76/5-migration-completeness.md +440 -0
- package/review/ALP-76/6-effect-best-practices.md +755 -0
- package/scripts/apply-branch-protection.sh +47 -0
- package/scripts/branch-protection-templates.json +79 -0
- package/scripts/prototype-summarization.ts +346 -0
- package/scripts/rebuild-hnswlib.js +58 -0
- package/scripts/setup-branch-protection.sh +64 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/active-provider.json +7 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/bm25.json +541 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/bm25.meta.json +5 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/config.json +8 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.bin +0 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.meta.bin +0 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/indexes/documents.json +60 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/indexes/links.json +13 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/indexes/sections.json +1197 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/configuration-management.md +99 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/distributed-systems.md +92 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/error-handling.md +78 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/failure-automation.md +55 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/job-context.md +69 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/process-orchestration.md +99 -0
- package/src/cli/argv-preprocessor.test.ts +210 -0
- package/src/cli/argv-preprocessor.ts +202 -0
- package/src/cli/cli.test.ts +627 -0
- package/src/cli/commands/backlinks.ts +54 -0
- package/src/cli/commands/config-cmd.ts +642 -0
- package/src/cli/commands/context.ts +285 -0
- package/src/cli/commands/duplicates.ts +122 -0
- package/src/cli/commands/embeddings.ts +529 -0
- package/src/cli/commands/index-cmd.ts +480 -0
- package/src/cli/commands/index.ts +16 -0
- package/src/cli/commands/links.ts +52 -0
- package/src/cli/commands/search.ts +1281 -0
- package/src/cli/commands/stats.ts +149 -0
- package/src/cli/commands/tree.ts +128 -0
- package/src/cli/config-layer.ts +176 -0
- package/src/cli/error-handler.test.ts +235 -0
- package/src/cli/error-handler.ts +655 -0
- package/src/cli/flag-schemas.ts +341 -0
- package/src/cli/help.ts +588 -0
- package/src/cli/index.ts +9 -0
- package/src/cli/main.ts +435 -0
- package/src/cli/options.ts +41 -0
- package/src/cli/shared-error-handling.ts +199 -0
- package/src/cli/typo-suggester.test.ts +105 -0
- package/src/cli/typo-suggester.ts +130 -0
- package/src/cli/utils.ts +259 -0
- package/src/config/file-provider.test.ts +320 -0
- package/src/config/file-provider.ts +273 -0
- package/src/config/index.ts +72 -0
- package/src/config/integration.test.ts +667 -0
- package/src/config/precedence.test.ts +277 -0
- package/src/config/precedence.ts +451 -0
- package/src/config/schema.test.ts +414 -0
- package/src/config/schema.ts +603 -0
- package/src/config/service.test.ts +320 -0
- package/src/config/service.ts +243 -0
- package/src/config/testing.test.ts +264 -0
- package/src/config/testing.ts +110 -0
- package/src/core/index.ts +1 -0
- package/src/core/types.ts +113 -0
- package/src/duplicates/detector.test.ts +183 -0
- package/src/duplicates/detector.ts +414 -0
- package/src/duplicates/index.ts +18 -0
- package/src/embeddings/embedding-namespace.test.ts +300 -0
- package/src/embeddings/embedding-namespace.ts +947 -0
- package/src/embeddings/heading-boost.test.ts +222 -0
- package/src/embeddings/hnsw-build-options.test.ts +198 -0
- package/src/embeddings/hyde.test.ts +272 -0
- package/src/embeddings/hyde.ts +264 -0
- package/src/embeddings/index.ts +10 -0
- package/src/embeddings/openai-provider.ts +414 -0
- package/src/embeddings/pricing.json +22 -0
- package/src/embeddings/provider-constants.ts +204 -0
- package/src/embeddings/provider-errors.test.ts +967 -0
- package/src/embeddings/provider-errors.ts +565 -0
- package/src/embeddings/provider-factory.test.ts +240 -0
- package/src/embeddings/provider-factory.ts +225 -0
- package/src/embeddings/provider-integration.test.ts +788 -0
- package/src/embeddings/query-preprocessing.test.ts +187 -0
- package/src/embeddings/semantic-search-threshold.test.ts +508 -0
- package/src/embeddings/semantic-search.ts +1270 -0
- package/src/embeddings/types.ts +359 -0
- package/src/embeddings/vector-store.ts +708 -0
- package/src/embeddings/voyage-provider.ts +313 -0
- package/src/errors/errors.test.ts +845 -0
- package/src/errors/index.ts +533 -0
- package/src/index/ignore-patterns.test.ts +354 -0
- package/src/index/ignore-patterns.ts +305 -0
- package/src/index/index.ts +4 -0
- package/src/index/indexer.ts +684 -0
- package/src/index/storage.ts +260 -0
- package/src/index/types.ts +147 -0
- package/src/index/watcher.ts +189 -0
- package/src/index.ts +30 -0
- package/src/integration/search-keyword.test.ts +678 -0
- package/src/mcp/server.ts +612 -0
- package/src/parser/index.ts +1 -0
- package/src/parser/parser.test.ts +291 -0
- package/src/parser/parser.ts +394 -0
- package/src/parser/section-filter.test.ts +277 -0
- package/src/parser/section-filter.ts +392 -0
- package/src/search/__tests__/hybrid-search.test.ts +650 -0
- package/src/search/bm25-store.ts +366 -0
- package/src/search/cross-encoder.test.ts +253 -0
- package/src/search/cross-encoder.ts +406 -0
- package/src/search/fuzzy-search.test.ts +419 -0
- package/src/search/fuzzy-search.ts +273 -0
- package/src/search/hybrid-search.ts +448 -0
- package/src/search/path-matcher.test.ts +276 -0
- package/src/search/path-matcher.ts +33 -0
- package/src/search/query-parser.test.ts +260 -0
- package/src/search/query-parser.ts +319 -0
- package/src/search/searcher.test.ts +280 -0
- package/src/search/searcher.ts +724 -0
- package/src/search/wink-bm25.d.ts +30 -0
- package/src/summarization/cli-providers/claude.ts +202 -0
- package/src/summarization/cli-providers/detection.test.ts +273 -0
- package/src/summarization/cli-providers/detection.ts +118 -0
- package/src/summarization/cli-providers/index.ts +8 -0
- package/src/summarization/cost.test.ts +139 -0
- package/src/summarization/cost.ts +102 -0
- package/src/summarization/error-handler.test.ts +127 -0
- package/src/summarization/error-handler.ts +111 -0
- package/src/summarization/index.ts +102 -0
- package/src/summarization/pipeline.test.ts +498 -0
- package/src/summarization/pipeline.ts +231 -0
- package/src/summarization/prompts.test.ts +269 -0
- package/src/summarization/prompts.ts +133 -0
- package/src/summarization/provider-factory.test.ts +396 -0
- package/src/summarization/provider-factory.ts +178 -0
- package/src/summarization/types.ts +184 -0
- package/src/summarize/budget-bugs.test.ts +620 -0
- package/src/summarize/formatters.ts +419 -0
- package/src/summarize/index.ts +20 -0
- package/src/summarize/summarizer.test.ts +275 -0
- package/src/summarize/summarizer.ts +597 -0
- package/src/summarize/verify-bugs.test.ts +238 -0
- package/src/types/huggingface-transformers.d.ts +66 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/tokens.test.ts +142 -0
- package/src/utils/tokens.ts +186 -0
- package/tests/fixtures/cli/.mdcontext/active-provider.json +7 -0
- package/tests/fixtures/cli/.mdcontext/config.json +8 -0
- package/tests/fixtures/cli/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.bin +0 -0
- package/tests/fixtures/cli/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.meta.bin +0 -0
- package/tests/fixtures/cli/.mdcontext/indexes/documents.json +33 -0
- package/tests/fixtures/cli/.mdcontext/indexes/links.json +12 -0
- package/tests/fixtures/cli/.mdcontext/indexes/sections.json +247 -0
- package/tests/fixtures/cli/README.md +9 -0
- package/tests/fixtures/cli/api-reference.md +11 -0
- package/tests/fixtures/cli/getting-started.md +11 -0
- package/tests/integration/embed-index.test.ts +712 -0
- package/tests/integration/search-context.test.ts +469 -0
- package/tests/integration/search-semantic.test.ts +522 -0
- package/tsconfig.json +26 -0
- package/vitest.config.ts +16 -0
- 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 |
|