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,428 @@
|
|
|
1
|
+
# Configuration and CLI Strategy Recommendation for mdcontext
|
|
2
|
+
|
|
3
|
+
## Executive Summary
|
|
4
|
+
|
|
5
|
+
This document synthesizes research from two approaches to CLI and configuration management for the mdcontext project:
|
|
6
|
+
|
|
7
|
+
1. **Traditional Stack**: c12/citty/Zod (UnJS ecosystem)
|
|
8
|
+
2. **Effect Stack**: @effect/cli, Effect Config, Layers
|
|
9
|
+
|
|
10
|
+
**Recommendation**: Adopt the **Effect ecosystem** for CLI and configuration management, contingent on a broader commitment to Effect as the application's foundational paradigm. If Effect adoption is uncertain or limited, the **c12/citty/Zod stack** provides a pragmatic, lower-risk alternative.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Decision Matrix
|
|
15
|
+
|
|
16
|
+
| Criterion | Weight | c12/citty/Zod | Effect Ecosystem | Notes |
|
|
17
|
+
| ----------------------------- | ------ | ------------- | ---------------- | ---------------------------------------- |
|
|
18
|
+
| **Learning Curve** | 15% | 9/10 | 5/10 | Effect requires paradigm shift |
|
|
19
|
+
| **Team Adoption** | 15% | 8/10 | 5/10 | UnJS is more approachable |
|
|
20
|
+
| **Type Safety** | 20% | 7/10 | 10/10 | Effect provides exhaustive type tracking |
|
|
21
|
+
| **Developer Experience** | 15% | 8/10 | 8/10 | Both excellent once learned |
|
|
22
|
+
| **Testing Patterns** | 10% | 6/10 | 9/10 | Effect Layers excel at DI/mocking |
|
|
23
|
+
| **Migration Complexity** | 10% | 8/10 | 4/10 | Effect requires significant rewrite |
|
|
24
|
+
| **Long-term Maintainability** | 10% | 7/10 | 9/10 | Effect's structure scales better |
|
|
25
|
+
| **Ecosystem Momentum** | 5% | 8/10 | 7/10 | Both growing; UnJS more mature |
|
|
26
|
+
| **Weighted Score** | 100% | **7.5/10** | **7.3/10** | Slight edge to traditional |
|
|
27
|
+
|
|
28
|
+
The scores are close, indicating this is a strategic choice rather than a clear technical winner.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Detailed Comparison
|
|
33
|
+
|
|
34
|
+
### 1. Learning Curve and Team Adoption
|
|
35
|
+
|
|
36
|
+
#### c12/citty/Zod Stack
|
|
37
|
+
|
|
38
|
+
- **Time to productivity**: 1-2 days
|
|
39
|
+
- **Prerequisite knowledge**: Basic TypeScript, familiar async/await patterns
|
|
40
|
+
- **Documentation quality**: Excellent, extensive UnJS ecosystem docs
|
|
41
|
+
- **Community resources**: Many examples from Nuxt, Nitro, and other UnJS projects
|
|
42
|
+
|
|
43
|
+
#### Effect Ecosystem
|
|
44
|
+
|
|
45
|
+
- **Time to productivity**: 1-2 weeks for basic patterns, months for mastery
|
|
46
|
+
- **Prerequisite knowledge**: Functional programming concepts, Effect core (generators, services, layers)
|
|
47
|
+
- **Documentation quality**: Good and improving; steeper initial ramp
|
|
48
|
+
- **Community resources**: Growing Discord community, Effect.website docs
|
|
49
|
+
|
|
50
|
+
**Verdict**: c12/citty/Zod is significantly easier for onboarding new contributors. Effect requires commitment to learning a new paradigm but pays dividends for complex applications.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
### 2. Type Safety and Developer Experience
|
|
55
|
+
|
|
56
|
+
#### c12/citty/Zod Stack
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
// Good type safety with Zod inference
|
|
60
|
+
const ConfigSchema = z.object({
|
|
61
|
+
logLevel: z.enum(["debug", "info", "warn", "error"]).default("info"),
|
|
62
|
+
port: z.coerce.number().default(3000),
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
type Config = z.infer<typeof ConfigSchema>; // Fully typed
|
|
66
|
+
|
|
67
|
+
// defineConfig provides IDE autocomplete
|
|
68
|
+
export default defineConfig({
|
|
69
|
+
logLevel: "debug", // Autocomplete works
|
|
70
|
+
});
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
- Types are inferred from Zod schemas
|
|
74
|
+
- `defineConfig` pattern provides excellent IDE support
|
|
75
|
+
- Runtime validation catches configuration errors
|
|
76
|
+
- Error messages from Zod are clear and actionable
|
|
77
|
+
|
|
78
|
+
#### Effect Ecosystem
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
// Superior type tracking through Effect types
|
|
82
|
+
const program = Effect.gen(function* () {
|
|
83
|
+
const port = yield* Config.number("PORT"); // Effect<number, ConfigError>
|
|
84
|
+
const host = yield* Config.string("HOST"); // Effect<string, ConfigError>
|
|
85
|
+
return { host, port };
|
|
86
|
+
}); // Effect<{host: string, port: number}, ConfigError>
|
|
87
|
+
|
|
88
|
+
// Errors are tracked in the type system
|
|
89
|
+
// Dependencies are tracked through R (Requirements) type
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
- Full effect tracking: success type, error type, and requirements
|
|
93
|
+
- ConfigError types distinguish missing vs. invalid configuration
|
|
94
|
+
- Layer dependencies are compile-time verified
|
|
95
|
+
- Exhaustive pattern matching on errors
|
|
96
|
+
|
|
97
|
+
**Verdict**: Effect provides superior type safety by tracking errors and dependencies in the type system. Zod provides "good enough" type safety for most use cases with less cognitive overhead.
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
### 3. Testing Patterns
|
|
102
|
+
|
|
103
|
+
#### c12/citty/Zod Stack
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
// Testing requires manual mocking
|
|
107
|
+
import { vi } from "vitest";
|
|
108
|
+
import { loadConfig } from "c12";
|
|
109
|
+
|
|
110
|
+
vi.mock("c12", () => ({
|
|
111
|
+
loadConfig: vi.fn().mockResolvedValue({
|
|
112
|
+
config: { logLevel: "debug", port: 3000 },
|
|
113
|
+
configFile: "/mock/path",
|
|
114
|
+
}),
|
|
115
|
+
}));
|
|
116
|
+
|
|
117
|
+
// Tests need to manage mock state
|
|
118
|
+
afterEach(() => {
|
|
119
|
+
vi.clearAllMocks();
|
|
120
|
+
});
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
- Standard vitest/jest mocking patterns
|
|
124
|
+
- Environment variables need process.env manipulation
|
|
125
|
+
- Test isolation requires careful mock management
|
|
126
|
+
- No built-in pattern for dependency injection
|
|
127
|
+
|
|
128
|
+
#### Effect Ecosystem
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
// Testing with Layer replacement
|
|
132
|
+
const TestConfigProvider = Layer.setConfigProvider(
|
|
133
|
+
ConfigProvider.fromMap(
|
|
134
|
+
new Map([
|
|
135
|
+
["LOG_LEVEL", "debug"],
|
|
136
|
+
["PORT", "3000"],
|
|
137
|
+
]),
|
|
138
|
+
),
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
const TestAppConfig = Layer.succeed(AppConfig, {
|
|
142
|
+
logLevel: "debug",
|
|
143
|
+
port: 3000,
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
// Test with injected dependencies
|
|
147
|
+
const result = await Effect.runPromise(
|
|
148
|
+
program.pipe(Effect.provide(TestAppConfig)),
|
|
149
|
+
);
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
- Layer system enables clean dependency injection
|
|
153
|
+
- Test layers can be composed and reused
|
|
154
|
+
- No global mock pollution
|
|
155
|
+
- Built-in support for mocking at service boundaries
|
|
156
|
+
|
|
157
|
+
**Verdict**: Effect's Layer system provides superior testing ergonomics, especially for integration tests and complex service graphs. The c12 approach works but requires more boilerplate.
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
### 4. Migration Complexity from Current State
|
|
162
|
+
|
|
163
|
+
#### To c12/citty/Zod
|
|
164
|
+
|
|
165
|
+
Migration steps:
|
|
166
|
+
|
|
167
|
+
1. Add c12 and Zod dependencies
|
|
168
|
+
2. Define Zod schema for configuration
|
|
169
|
+
3. Create `defineConfig` helper
|
|
170
|
+
4. Replace current config loading with c12
|
|
171
|
+
5. Add citty for CLI if not using another solution
|
|
172
|
+
|
|
173
|
+
**Estimated effort**: 1-2 days for basic implementation
|
|
174
|
+
**Risk level**: Low - incremental migration possible
|
|
175
|
+
|
|
176
|
+
#### To Effect Ecosystem
|
|
177
|
+
|
|
178
|
+
Migration steps:
|
|
179
|
+
|
|
180
|
+
1. Add Effect core and platform packages
|
|
181
|
+
2. Learn Effect fundamentals (generators, Effects, services)
|
|
182
|
+
3. Rewrite configuration as ConfigProvider/Layer pattern
|
|
183
|
+
4. Migrate CLI to @effect/cli
|
|
184
|
+
5. Refactor dependent code to consume Effect services
|
|
185
|
+
6. Update error handling throughout
|
|
186
|
+
|
|
187
|
+
**Estimated effort**: 1-2 weeks minimum, ongoing learning
|
|
188
|
+
**Risk level**: High - requires comprehensive rewrite
|
|
189
|
+
|
|
190
|
+
**Verdict**: c12/citty/Zod allows incremental adoption. Effect is an all-or-nothing paradigm shift.
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
### 5. Long-term Maintainability
|
|
195
|
+
|
|
196
|
+
#### c12/citty/Zod Stack
|
|
197
|
+
|
|
198
|
+
- **Pros**:
|
|
199
|
+
- Familiar patterns for most TypeScript developers
|
|
200
|
+
- Easy to onboard new team members
|
|
201
|
+
- Smaller dependency footprint
|
|
202
|
+
- UnJS ecosystem is stable and production-proven (Nuxt, Nitro)
|
|
203
|
+
|
|
204
|
+
- **Cons**:
|
|
205
|
+
- Error handling remains ad-hoc (try/catch)
|
|
206
|
+
- Dependency injection must be implemented manually
|
|
207
|
+
- Configuration precedence logic can become complex
|
|
208
|
+
- Less structured approach to service composition
|
|
209
|
+
|
|
210
|
+
#### Effect Ecosystem
|
|
211
|
+
|
|
212
|
+
- **Pros**:
|
|
213
|
+
- Enforced structure through type system
|
|
214
|
+
- Error handling is explicit and composable
|
|
215
|
+
- Resource management via Scope prevents leaks
|
|
216
|
+
- Service dependencies are compile-time verified
|
|
217
|
+
- Excellent for large, complex applications
|
|
218
|
+
|
|
219
|
+
- **Cons**:
|
|
220
|
+
- Requires ongoing Effect expertise
|
|
221
|
+
- Fewer developers familiar with paradigm
|
|
222
|
+
- Bundle size considerations
|
|
223
|
+
- Breaking changes possible as Effect evolves (though now stable)
|
|
224
|
+
|
|
225
|
+
**Verdict**: Effect provides stronger architectural guarantees for long-term maintenance but requires sustained investment in the paradigm.
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
### 6. Ecosystem Momentum
|
|
230
|
+
|
|
231
|
+
#### c12/citty/Zod (UnJS)
|
|
232
|
+
|
|
233
|
+
- **Adoption**: Nuxt (100k+ GitHub stars), Nitro, many production deployments
|
|
234
|
+
- **Maintenance**: UnJS is actively maintained by Nuxt team
|
|
235
|
+
- **Growth**: Stable, mature ecosystem
|
|
236
|
+
- **Industry trend**: TypeScript config files (`defineConfig`) are the 2026 standard
|
|
237
|
+
|
|
238
|
+
#### Effect Ecosystem
|
|
239
|
+
|
|
240
|
+
- **Adoption**: Growing rapidly in TypeScript community
|
|
241
|
+
- **Maintenance**: Effect Solutions (commercial entity) supports development
|
|
242
|
+
- **Growth**: Accelerating; VS Code extension, create-effect-app, growing Discord
|
|
243
|
+
- **Industry trend**: Functional Effect systems gaining traction (Scala ZIO, etc.)
|
|
244
|
+
|
|
245
|
+
**Verdict**: UnJS is more established; Effect is growing faster from a smaller base. Both are viable long-term.
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## Recommendation
|
|
250
|
+
|
|
251
|
+
### Primary Recommendation: Effect Ecosystem
|
|
252
|
+
|
|
253
|
+
**Adopt Effect** if the following conditions are met:
|
|
254
|
+
|
|
255
|
+
1. **mdcontext is committed to Effect** for its core functionality (not just CLI/config)
|
|
256
|
+
2. **Team is willing to invest** in learning the Effect paradigm (1-2 weeks ramp-up)
|
|
257
|
+
3. **Application complexity warrants it** (multiple services, complex error handling, resource management)
|
|
258
|
+
|
|
259
|
+
**Rationale**:
|
|
260
|
+
|
|
261
|
+
- Unified paradigm from CLI to core logic to file operations
|
|
262
|
+
- Superior long-term maintainability through type-enforced architecture
|
|
263
|
+
- Testing is cleaner with Layer-based dependency injection
|
|
264
|
+
- The Effect ecosystem provides @effect/platform for file operations that mdcontext will need
|
|
265
|
+
- Effect's ConfigProvider + Config module handles the precedence hierarchy elegantly
|
|
266
|
+
|
|
267
|
+
### Fallback Recommendation: c12/citty/Zod Stack
|
|
268
|
+
|
|
269
|
+
**Adopt the traditional stack** if:
|
|
270
|
+
|
|
271
|
+
1. **Effect adoption is uncertain** or limited to specific modules
|
|
272
|
+
2. **Rapid iteration is priority** over architectural purity
|
|
273
|
+
3. **Contributor accessibility** is important (open source considerations)
|
|
274
|
+
4. **Bundle size matters** for distribution
|
|
275
|
+
|
|
276
|
+
**Rationale**:
|
|
277
|
+
|
|
278
|
+
- Faster time to implementation
|
|
279
|
+
- Lower barrier for contributors
|
|
280
|
+
- Production-proven in the UnJS ecosystem
|
|
281
|
+
- Allows Effect to be adopted incrementally for core logic only
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
## Implementation Roadmap
|
|
286
|
+
|
|
287
|
+
### If Choosing Effect
|
|
288
|
+
|
|
289
|
+
**Phase 1: Foundation (Week 1)**
|
|
290
|
+
|
|
291
|
+
```
|
|
292
|
+
- Set up @effect/cli for basic command structure
|
|
293
|
+
- Implement Config service with Layer
|
|
294
|
+
- Create basic commands (init, build, watch)
|
|
295
|
+
- Set up test infrastructure with Layer mocking
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
**Phase 2: Integration (Week 2)**
|
|
299
|
+
|
|
300
|
+
```
|
|
301
|
+
- Add @effect/platform for file system operations
|
|
302
|
+
- Implement configuration file support (mdcontext.config.ts)
|
|
303
|
+
- Add environment variable precedence
|
|
304
|
+
- Build out service layer for core functionality
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
**Phase 3: Polish (Week 3+)**
|
|
308
|
+
|
|
309
|
+
```
|
|
310
|
+
- Add shell completion generation
|
|
311
|
+
- Implement wizard mode for complex commands
|
|
312
|
+
- Add comprehensive error handling with ConfigError
|
|
313
|
+
- Performance optimization
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
### If Choosing c12/citty/Zod
|
|
317
|
+
|
|
318
|
+
**Phase 1: Config System (Day 1-2)**
|
|
319
|
+
|
|
320
|
+
```
|
|
321
|
+
- Define Zod schema for configuration
|
|
322
|
+
- Set up c12 loader with defineConfig helper
|
|
323
|
+
- Implement precedence: CLI > env > file > defaults
|
|
324
|
+
- Create configuration module with proper types
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
**Phase 2: CLI Implementation (Day 3-4)**
|
|
328
|
+
|
|
329
|
+
```
|
|
330
|
+
- Set up citty with command structure
|
|
331
|
+
- Integrate configuration loading
|
|
332
|
+
- Add help and version commands
|
|
333
|
+
- Implement core commands
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
**Phase 3: Integration (Day 5+)**
|
|
337
|
+
|
|
338
|
+
```
|
|
339
|
+
- Add watch mode with file system integration
|
|
340
|
+
- Implement error handling patterns
|
|
341
|
+
- Add testing infrastructure
|
|
342
|
+
- Documentation
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
## Appendix: Key Code Patterns
|
|
348
|
+
|
|
349
|
+
### Effect Pattern: Config Service Layer
|
|
350
|
+
|
|
351
|
+
```typescript
|
|
352
|
+
import { Context, Effect, Layer, Config } from "effect";
|
|
353
|
+
|
|
354
|
+
class AppConfig extends Context.Tag("AppConfig")<
|
|
355
|
+
AppConfig,
|
|
356
|
+
{
|
|
357
|
+
readonly logLevel: "debug" | "info" | "warn" | "error";
|
|
358
|
+
readonly port: number;
|
|
359
|
+
readonly apiKey: string | undefined;
|
|
360
|
+
}
|
|
361
|
+
>() {}
|
|
362
|
+
|
|
363
|
+
const AppConfigLive = Layer.effect(
|
|
364
|
+
AppConfig,
|
|
365
|
+
Effect.gen(function* () {
|
|
366
|
+
const logLevel = yield* Config.literal("LOG_LEVEL")(
|
|
367
|
+
"debug",
|
|
368
|
+
"info",
|
|
369
|
+
"warn",
|
|
370
|
+
"error",
|
|
371
|
+
).pipe(Config.withDefault("info"));
|
|
372
|
+
const port = yield* Config.number("PORT").pipe(Config.withDefault(3000));
|
|
373
|
+
const apiKey = yield* Config.string("API_KEY").pipe(Config.optional);
|
|
374
|
+
return {
|
|
375
|
+
logLevel,
|
|
376
|
+
port,
|
|
377
|
+
apiKey: apiKey._tag === "Some" ? apiKey.value : undefined,
|
|
378
|
+
};
|
|
379
|
+
}),
|
|
380
|
+
);
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
### c12/Zod Pattern: Config Loader
|
|
384
|
+
|
|
385
|
+
```typescript
|
|
386
|
+
import { loadConfig } from "c12";
|
|
387
|
+
import { z } from "zod";
|
|
388
|
+
|
|
389
|
+
const ConfigSchema = z.object({
|
|
390
|
+
logLevel: z.enum(["debug", "info", "warn", "error"]).default("info"),
|
|
391
|
+
port: z.coerce.number().default(3000),
|
|
392
|
+
apiKey: z.string().optional(),
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
export type Config = z.infer<typeof ConfigSchema>;
|
|
396
|
+
|
|
397
|
+
export async function loadMdcontextConfig(overrides?: Partial<Config>) {
|
|
398
|
+
const { config } = await loadConfig({
|
|
399
|
+
name: "mdcontext",
|
|
400
|
+
defaults: ConfigSchema.parse({}),
|
|
401
|
+
overrides,
|
|
402
|
+
dotenv: true,
|
|
403
|
+
globalRc: true,
|
|
404
|
+
});
|
|
405
|
+
return ConfigSchema.parse(config);
|
|
406
|
+
}
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
---
|
|
410
|
+
|
|
411
|
+
## References
|
|
412
|
+
|
|
413
|
+
### Source Documents
|
|
414
|
+
|
|
415
|
+
- `/Users/alphab/Dev/LLM/DEV/mdcontext/docs/033-research-configuration-management.md`
|
|
416
|
+
- `/Users/alphab/Dev/LLM/DEV/mdcontext/docs/034-research-effect-cli-config.md`
|
|
417
|
+
|
|
418
|
+
### Key Libraries
|
|
419
|
+
|
|
420
|
+
- [c12 - Smart Configuration Loader](https://github.com/unjs/c12)
|
|
421
|
+
- [citty - CLI Builder](https://github.com/unjs/citty)
|
|
422
|
+
- [Zod - Schema Validation](https://zod.dev/)
|
|
423
|
+
- [@effect/cli](https://github.com/Effect-TS/effect/tree/main/packages/cli)
|
|
424
|
+
- [Effect Configuration](https://effect.website/docs/configuration/)
|
|
425
|
+
|
|
426
|
+
---
|
|
427
|
+
|
|
428
|
+
_Analysis completed: 2026-01-21_
|