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,277 @@
1
+ # Consolidated Configuration Tasks for mdcontext
2
+
3
+ **Context**: mdcontext already uses `@effect/cli`. This means the Effect ecosystem has lower adoption friction, and Effect Config + Layers is the recommended approach (not c12/citty/Zod).
4
+
5
+ **Strategy**: Full Effect-native configuration using `Config`, `ConfigProvider`, and `Layer` patterns.
6
+
7
+ ---
8
+
9
+ ## Phase 1: Effect Config Foundation
10
+
11
+ ### Task 1: Create Effect Config Schema Module
12
+
13
+ **Priority**: High
14
+ **Effort**: Small (2-4 hours)
15
+ **Dependencies**: None
16
+
17
+ **Description**: Define all configuration options using Effect's `Config` combinators (`Config.string`, `Config.number`, `Config.literal`, etc.). This replaces the Zod schema approach and provides native integration with Effect's ConfigProvider system.
18
+
19
+ **Why it matters**: Effect Config provides compile-time tracking of config requirements through the type system, eliminating runtime-only validation errors and enabling cleaner dependency injection.
20
+
21
+ ---
22
+
23
+ ### Task 2: Create ConfigService Layer
24
+
25
+ **Priority**: High
26
+ **Effort**: Small (2-4 hours)
27
+ **Dependencies**: Task 1
28
+
29
+ **Description**: Wrap configuration in an Effect `Context.Tag` and `Layer`, enabling dependency injection throughout the application. Services will access config via `yield* ConfigService` rather than direct function parameters.
30
+
31
+ **Why it matters**: Layer-based config enables test isolation without mocking, follows Effect best practices, and provides consistent config access across all commands and services.
32
+
33
+ ---
34
+
35
+ ### Task 3: Implement File-based ConfigProvider
36
+
37
+ **Priority**: High
38
+ **Effort**: Medium (1-2 days)
39
+ **Dependencies**: Task 1
40
+
41
+ **Description**: Create a custom `ConfigProvider` that reads from `mdcontext.config.ts` (or `.json`/`.yaml`). Use `ConfigProvider.fromMap` or `ConfigProvider.nested` to map file contents to the Effect config namespace.
42
+
43
+ **Why it matters**: Enables persistent configuration without repeating CLI flags. Users expect config file support in modern CLI tools.
44
+
45
+ ---
46
+
47
+ ### Task 4: Implement Config Precedence Chain
48
+
49
+ **Priority**: High
50
+ **Effort**: Medium (4-8 hours)
51
+ **Dependencies**: Task 3
52
+
53
+ **Description**: Compose ConfigProviders using `ConfigProvider.orElse` to establish precedence: CLI flags > Environment variables > Config file > Defaults. Effect's ConfigProvider composition makes this elegant.
54
+
55
+ **Why it matters**: Standard CLI behavior. Users expect CLI flags to override everything, env vars to override files, and sensible defaults when nothing is specified.
56
+
57
+ ---
58
+
59
+ ## Phase 2: CLI Integration
60
+
61
+ ### Task 5: Integrate Config Layer with CLI Commands
62
+
63
+ **Priority**: High
64
+ **Effort**: Medium (1-2 days)
65
+ **Dependencies**: Task 2, Task 4
66
+
67
+ **Description**: Modify all CLI command handlers to `yield* ConfigService` instead of using inline defaults. Update `@effect/cli` Options to use `Config` values as defaults where appropriate. Each command should `.pipe(Effect.provide(ConfigLive))`.
68
+
69
+ **Why it matters**: Completes the config system integration. Users can now set persistent defaults in config files that CLI commands respect.
70
+
71
+ ---
72
+
73
+ ### Task 6: Add Global --config Flag
74
+
75
+ **Priority**: Medium
76
+ **Effort**: Small (2-4 hours)
77
+ **Dependencies**: Task 5
78
+
79
+ **Description**: Add `Options.file("config").pipe(Options.withAlias("c"))` as a global option that overrides the config file search path. Pass this to the ConfigProvider construction.
80
+
81
+ **Why it matters**: Allows per-invocation config file selection, useful for testing and multi-project setups.
82
+
83
+ ---
84
+
85
+ ### Task 7: Add config init Subcommand
86
+
87
+ **Priority**: Low
88
+ **Effort**: Small (2-4 hours)
89
+ **Dependencies**: Task 3
90
+
91
+ **Description**: Create `mdcontext config init` command that generates a starter `mdcontext.config.ts` with `defineConfig()` helper and documented defaults.
92
+
93
+ **Why it matters**: Lowers barrier to config adoption and documents available options by example.
94
+
95
+ ---
96
+
97
+ ## Phase 3: Environment & Secrets
98
+
99
+ ### Task 8: Implement MDCONTEXT\_ Environment Variable Mapping
100
+
101
+ **Priority**: Medium
102
+ **Effort**: Small (2-4 hours)
103
+ **Dependencies**: Task 1
104
+
105
+ **Description**: Configure Effect's default `ConfigProvider.fromEnv()` with nested path support (`MDCONTEXT_SEARCH_LIMIT` maps to `search.limit`). Use `Config.nested("mdcontext")` pattern.
106
+
107
+ **Why it matters**: Standard pattern for CI/CD integration and containerized environments. Keeps secrets out of config files.
108
+
109
+ ---
110
+
111
+ ### Task 9: Use Effect Redacted for API Keys
112
+
113
+ **Priority**: Medium
114
+ **Effort**: Small (1-2 hours)
115
+ **Dependencies**: None
116
+
117
+ **Description**: Replace `process.env.OPENAI_API_KEY` with `Config.redacted("OPENAI_API_KEY")`. Update `OpenAIProvider` to accept `Redacted<string>` and use `Redacted.value()` only when making API calls.
118
+
119
+ **Why it matters**: Prevents API keys from appearing in logs or error messages. Effect's `Redacted` type shows `<redacted>` when stringified.
120
+
121
+ ---
122
+
123
+ ## Phase 4: Validation & Errors
124
+
125
+ ### Task 10: Implement User-friendly Config Errors
126
+
127
+ **Priority**: High
128
+ **Effort**: Medium (4-8 hours)
129
+ **Dependencies**: Task 3
130
+
131
+ **Description**: Create a custom error formatter for `ConfigError` that shows file location, expected type, actual value, and hints. Use `Effect.catchTag("ConfigError", ...)` to intercept and format errors before CLI output.
132
+
133
+ **Why it matters**: Good error messages dramatically reduce user frustration. Config errors should guide users to the fix, not just report the problem.
134
+
135
+ ---
136
+
137
+ ### Task 11: Add config check Subcommand
138
+
139
+ **Priority**: Low
140
+ **Effort**: Small (2-4 hours)
141
+ **Dependencies**: Task 10
142
+
143
+ **Description**: Create `mdcontext config check` that validates configuration and displays the effective merged config from all sources (file, env, defaults).
144
+
145
+ **Why it matters**: Useful for debugging config issues and CI/CD validation. Shows users what config values are actually in effect.
146
+
147
+ ---
148
+
149
+ ## Phase 5: Testing Infrastructure
150
+
151
+ ### Task 12: Create Config Testing Utilities
152
+
153
+ **Priority**: Medium
154
+ **Effort**: Small (2-4 hours)
155
+ **Dependencies**: Task 2
156
+
157
+ **Description**: Export `TestConfigLayer` helpers that provide mock config via `Layer.succeed(ConfigService, {...})`. Create `withTestConfig(overrides)` utility for partial config in tests.
158
+
159
+ **Why it matters**: Enables isolated testing without environment pollution. Tests can run in parallel with different configs.
160
+
161
+ ---
162
+
163
+ ### Task 13: Add Config Integration Tests
164
+
165
+ **Priority**: Medium
166
+ **Effort**: Medium (4-8 hours)
167
+ **Dependencies**: Task 12, Task 4
168
+
169
+ **Description**: Write integration tests verifying: (1) CLI flags override config file, (2) env vars override config file, (3) config file overrides defaults, (4) invalid config produces friendly errors.
170
+
171
+ **Why it matters**: Validates the precedence chain works correctly. Catches regressions in config handling.
172
+
173
+ ---
174
+
175
+ ## Phase 6: Consolidation & Cleanup
176
+
177
+ ### Task 14: Extract Hardcoded Constants to Config
178
+
179
+ **Priority**: Medium
180
+ **Effort**: Medium (1-2 days)
181
+ **Dependencies**: Task 5
182
+
183
+ **Description**: Move hardcoded values from `summarizer.ts` (TOKEN_BUDGETS, compression ratios), `openai-provider.ts` (model, batch size), `searcher.ts` (limits, thresholds), and other files to ConfigService. Keep constants as defaults in the Config definition.
184
+
185
+ **Why it matters**: Enables user customization of currently hardcoded behavior. Centralizes "magic numbers" for easier maintenance.
186
+
187
+ ---
188
+
189
+ ### Task 15: Version from package.json
190
+
191
+ **Priority**: Low
192
+ **Effort**: Small (1-2 hours)
193
+ **Dependencies**: None
194
+
195
+ **Description**: Replace hardcoded `'0.1.0'` in `main.ts` and `mcp/server.ts` with dynamic version read from `package.json`. Use `Effect.sync(() => require('../package.json').version)` or import assertion.
196
+
197
+ **Why it matters**: Version should match package.json automatically. Eliminates manual version sync across files.
198
+
199
+ ---
200
+
201
+ ## Phase 7: Documentation
202
+
203
+ ### Task 16: Document Configuration System
204
+
205
+ **Priority**: High
206
+ **Effort**: Medium (4-8 hours)
207
+ **Dependencies**: Task 5
208
+
209
+ **Description**: Create configuration documentation covering: all options with descriptions, TypeScript config file example, environment variable mapping, precedence explanation, and migration guide from CLI-only usage.
210
+
211
+ **Why it matters**: Users can't use features they don't know about. Good docs reduce support burden and establish mdcontext as a professional tool.
212
+
213
+ ---
214
+
215
+ ## Summary
216
+
217
+ | Phase | Tasks | Effort | Priority Focus |
218
+ | ------------------ | ---------- | ------ | -------------- |
219
+ | 1. Foundation | 1, 2, 3, 4 | Medium | High |
220
+ | 2. CLI Integration | 5, 6, 7 | Medium | High/Medium |
221
+ | 3. Environment | 8, 9 | Small | Medium |
222
+ | 4. Validation | 10, 11 | Medium | High/Low |
223
+ | 5. Testing | 12, 13 | Medium | Medium |
224
+ | 6. Cleanup | 14, 15 | Medium | Medium/Low |
225
+ | 7. Documentation | 16 | Medium | High |
226
+
227
+ ### Recommended MVP (Minimum Viable Configuration)
228
+
229
+ **Tasks 1, 2, 3, 4, 5, 10, 16**
230
+
231
+ This provides:
232
+
233
+ - Working Effect Config with Layer
234
+ - Config file support
235
+ - CLI integration with precedence
236
+ - Friendly error messages
237
+ - Documentation
238
+
239
+ ---
240
+
241
+ ## Dependencies Graph
242
+
243
+ ```
244
+ Task 1 (Config Schema) ────┬─► Task 2 (ConfigService Layer) ─► Task 5 (CLI Integration)
245
+ │ │
246
+ │ ├─► Task 6 (--config flag)
247
+ │ │
248
+ ├─► Task 3 (File ConfigProvider) ───┼─► Task 4 (Precedence Chain)
249
+ │ │ │
250
+ │ └─► Task 7 (config init) │
251
+ │ │
252
+ ├─► Task 8 (Env Vars) └─► Task 14 (Extract Constants)
253
+
254
+ └─► Task 16 (Documentation)
255
+
256
+ Task 2 (Layer) ─► Task 12 (Test Utils) ─► Task 13 (Integration Tests)
257
+
258
+ Task 3 (File Provider) ─► Task 10 (Error Formatting) ─► Task 11 (config check)
259
+
260
+ Task 9 (Redacted) ──── Independent
261
+ Task 15 (Version) ──── Independent
262
+ ```
263
+
264
+ ---
265
+
266
+ ## Tasks Removed from Original List
267
+
268
+ The following tasks from `03-task-candidates.md` are **not applicable** given Effect is already in use:
269
+
270
+ - **1.1 Define Configuration Schema with Zod** - Replaced by Effect Config (Task 1)
271
+ - **1.2 Create defineConfig Helper** - Still useful but implementation differs (included in Task 7)
272
+ - **1.3 Implement Config Loader with c12** - Replaced by Effect ConfigProvider (Task 3)
273
+ - **5.2 Add Schema-Based Config Type Generation** - Effect Config provides this natively
274
+
275
+ ---
276
+
277
+ _Created: 2026-01-21_
@@ -0,0 +1,357 @@
1
+ # Configuration Documentation Analysis - Executive Summary
2
+
3
+ > **⚠️ RESEARCH STATUS: PARTIALLY OUTDATED**
4
+ > - **Created:** 2026-01-24 (pre-fixes)
5
+ > - **Codebase at time:** Before commit db80c90c (pre-fix validation)
6
+ > - **Current Status:** Most issues described here are now FIXED
7
+ > - **Last Validated:** 2026-01-24 (post-fixes)
8
+ > - **See:** [fix-validation.md](./fix-validation.md) for authoritative current state
9
+ > - **Git commit at research time:** ~bbebe32 to 375f21b (before fix commits)
10
+
11
+ **Date:** 2026-01-24
12
+ **Worktree:** nancy-ALP-139
13
+ **Full Analysis:** [analysis.md](./analysis.md)
14
+
15
+ ---
16
+
17
+ ## TL;DR
18
+
19
+ The mdcontext config system is well-implemented but has **one critical bug** and **one major omission**:
20
+
21
+ 1. **CRITICAL BUG:** TypeScript config files (`.ts`) fail to load despite being recommended
22
+ 2. **MAJOR GAP:** Summarization config section exists but is hidden from users
23
+
24
+ **Documentation Quality:** Good (comprehensive CONFIG.md, but gaps in README)
25
+ **Implementation Quality:** Strong (Effect-based, well-tested, type-safe)
26
+ **User Experience:** Mixed (works great with JSON, broken with TypeScript)
27
+
28
+ ---
29
+
30
+ ## Critical Findings
31
+
32
+ ### 🔴 Bug: TypeScript Config Loading Failure ✅ FIXED
33
+
34
+ **Current Status:** FIXED in commit db80c90c (2026-01-24)
35
+ - Default format changed to `.js` with JSDoc types
36
+ - TypeScript limitation documented in CONFIG.md
37
+ - Users now get working config by default
38
+
39
+ **What happened (original issue):**
40
+ ```bash
41
+ $ npx . config init # Creates mdcontext.config.ts (recommended)
42
+ $ npx . config check --json # Shows error
43
+ {
44
+ "valid": false,
45
+ "errors": ["Unknown file extension \".ts\""]
46
+ }
47
+ ```
48
+
49
+ **Impact:**
50
+ - Users follow docs → create TypeScript config → config silently fails
51
+ - Config is documented as "Best: type-safe with intellisense"
52
+ - But it doesn't actually work at runtime
53
+
54
+ **Root cause:** Node.js can't import `.ts` files without a loader (tsx, ts-node, etc.)
55
+
56
+ **Fix implemented:** Option 2 - Document limitation, recommend `.js` with JSDoc types (default)
57
+
58
+ ---
59
+
60
+ ### 🟡 Gap: Summarization Config Hidden ✅ FIXED
61
+
62
+ **Current Status:** FIXED in commits before db80c90c
63
+ - Summarization now included in generated JSON configs
64
+ - Summarization now included in generated JS configs
65
+ - Summarization now shown in `config check` output
66
+ - Fully exposed and discoverable
67
+
68
+ **What was wrong (original issue):**
69
+ - Summarization section exists in schema (6 options)
70
+ - Documented in CONFIG.md
71
+ - **NOT** in generated config files
72
+ - **NOT** in `config check` output
73
+ - Users don't know it's configurable
74
+
75
+ **Impact:** Hidden feature, users can't discover or configure it
76
+
77
+ **Fix implemented:** Added summarization to all locations in `config-cmd.ts`:
78
+ - `generateConfigContent()` function - both JSON and JS formats
79
+ - `checkCommand` section builder
80
+ - `ConfigWithSources` interface
81
+ - `configToJsonFormat()` converter
82
+
83
+ ---
84
+
85
+ ## Quick Stats
86
+
87
+ ### Configuration System
88
+ - **Total Options:** 33 configurable values
89
+ - **Sections:** 6 (index, search, embeddings, summarization, output, paths)
90
+ - **File Formats:** 6 supported (ts, js, mjs, json, .mdcontextrc, .mdcontextrc.json)
91
+ - **Commands:** 3 (init, show, check)
92
+
93
+ ### Documentation
94
+ - **CONFIG.md:** 19,536 bytes, comprehensive
95
+ - **USAGE.md:** 12,473 bytes, good overview
96
+ - **README.md:** 6,242 bytes, minimal config info
97
+ - **Inline Docs:** Excellent throughout codebase
98
+
99
+ ### Testing
100
+ - ✅ All 3 commands tested manually
101
+ - ✅ JSON config format works perfectly
102
+ - ✅ Environment variable overrides work
103
+ - ✅ Config check shows sources correctly
104
+ - ❌ TypeScript config format fails
105
+ - ⚠️ Summarization not exposed
106
+
107
+ ---
108
+
109
+ ## What Works Well
110
+
111
+ 1. **Layered Configuration**
112
+ - CLI flags > env vars > file > defaults
113
+ - Precedence is clear and well-documented
114
+ - Source tracking in `config check` is excellent
115
+
116
+ 2. **Config Check Command**
117
+ ```bash
118
+ $ npx . config check
119
+ Configuration validated successfully!
120
+ Source: /path/to/mdcontext.config.json
121
+
122
+ Effective configuration:
123
+ index:
124
+ maxDepth: 10 (from config file)
125
+ excludePatterns: [...] (from config file)
126
+ ...
127
+ search:
128
+ defaultLimit: 25 (from environment)
129
+ ...
130
+ ```
131
+ Shows exactly where each value comes from - brilliant!
132
+
133
+ 3. **Documentation Quality**
134
+ - CONFIG.md is comprehensive (all 33 options documented)
135
+ - Complete env var reference
136
+ - Real-world examples (CI/CD, monorepo, etc.)
137
+ - Migration guide from CLI-only usage
138
+
139
+ 4. **Implementation**
140
+ - Effect-based, type-safe
141
+ - Well-tested (6 test files)
142
+ - Clean architecture (schema, service, provider, precedence)
143
+ - Good error handling
144
+
145
+ ---
146
+
147
+ ## What Needs Work
148
+
149
+ ### Priority 1: Critical
150
+ 1. ✅ FIXED - Fix TypeScript loading or document limitation
151
+ 2. ✅ FIXED - Expose summarization in config commands
152
+ 3. ✅ FIXED - Add config to main CLI help
153
+
154
+ ### Priority 2: Important
155
+ 1. ✅ FIXED - Update README with config overview
156
+ 2. ⏭️ TODO - Add troubleshooting section to CONFIG.md (only remaining task)
157
+ 3. ⏭️ TODO - Fix schema URL (currently 404)
158
+
159
+ ### Priority 3: Nice-to-Have
160
+ 1. Add `config validate <file>` command
161
+ 2. Add `--minimal` flag to `config init`
162
+ 3. Better validation warnings
163
+ 4. Config profiles/environments support
164
+
165
+ ---
166
+
167
+ ## Recommendations
168
+
169
+ ### Immediate (Est. 8-15 hours)
170
+
171
+ 1. **TypeScript Loading** (4-8 hours)
172
+ - **Option A:** Bundle tsx and use for .ts files
173
+ - **Option B:** Document limitation, change default to `.js`
174
+ - **Recommended:** Option B (safer, simpler)
175
+
176
+ 2. **Expose Summarization** (2-4 hours)
177
+ - Add to `generateConfigContent()` in config-cmd.ts
178
+ - Add to `checkCommand` section builder
179
+ - Test all outputs (text, JSON, both formats)
180
+
181
+ 3. **Documentation Updates** (2-3 hours)
182
+ - Add config section to README quick reference
183
+ - Add troubleshooting to CONFIG.md
184
+ - Document TypeScript limitation
185
+
186
+ ### Short-term (Est. 8-12 hours)
187
+
188
+ 1. Add config commands to main `--help` output
189
+ 2. Create and publish JSON schema
190
+ 3. Enhance `config show` (add `--values` flag)
191
+ 4. Add validation warnings for unknown options
192
+
193
+ ---
194
+
195
+ ## Example Issues Found
196
+
197
+ ### TypeScript Config Fails
198
+ ```bash
199
+ $ npx . config init
200
+ Created mdcontext.config.ts
201
+ # File created but won't load!
202
+
203
+ $ npx . config check --json
204
+ {
205
+ "valid": false,
206
+ "errors": [
207
+ "Failed to load config from /path/mdcontext.config.ts: Unknown file extension \".ts\""
208
+ ]
209
+ }
210
+ ```
211
+
212
+ ### Summarization Not in Generated Config
213
+ ```json
214
+ // From: npx . config init --format json
215
+ {
216
+ "$schema": "https://mdcontext.dev/schema.json",
217
+ "index": { ... },
218
+ "search": { ... },
219
+ "embeddings": { ... },
220
+ "output": { ... }
221
+ // ❌ Missing: "summarization": { ... }
222
+ }
223
+ ```
224
+
225
+ ### Summarization Not in Config Check
226
+ ```bash
227
+ $ npx . config check
228
+ Effective configuration:
229
+ index: ...
230
+ search: ...
231
+ embeddings: ...
232
+ output: ...
233
+ paths: ...
234
+ # ❌ Missing: summarization section
235
+ ```
236
+
237
+ ---
238
+
239
+ ## User Impact Analysis
240
+
241
+ ### Current User Journey (Broken)
242
+
243
+ 1. User reads README → no mention of config
244
+ 2. User reads CONFIG.md → sees TypeScript recommended
245
+ 3. User runs `npx . config init` → creates .ts file
246
+ 4. User edits config → adds custom values
247
+ 5. User runs `npx . index` → config silently ignored
248
+ 6. **User confused:** "Why isn't my config working?"
249
+
250
+ ### Ideal User Journey (Fixed)
251
+
252
+ 1. User reads README → sees config quick reference
253
+ 2. User runs `npx . config init --format json`
254
+ 3. User edits config → adds custom values
255
+ 4. User runs `npx . config check` → sees config loaded
256
+ 5. User runs `npx . index` → config works correctly
257
+ 6. **User happy:** Config works as expected
258
+
259
+ ---
260
+
261
+ ## Testing Summary
262
+
263
+ ### Tested ✅
264
+ - `config init` (both JSON and TypeScript formats)
265
+ - `config show` (with and without config file)
266
+ - `config check` (text and JSON output)
267
+ - Environment variable overrides
268
+ - Config file discovery
269
+ - Help text for all commands
270
+
271
+ ### Found Working ✅
272
+ - JSON config files
273
+ - JavaScript config files (based on code review)
274
+ - Environment variables
275
+ - Config precedence
276
+ - Source tracking
277
+ - JSON output format
278
+
279
+ ### Found Broken ❌
280
+ - TypeScript config files
281
+ - Summarization section exposure
282
+
283
+ ### Not Tested (Out of Scope)
284
+ - All 33 individual config options
285
+ - Multiple config files
286
+ - Parent directory search
287
+ - CLI flag overrides
288
+ - Testing utilities
289
+
290
+ ---
291
+
292
+ ## Files to Update
293
+
294
+ ### Must Update ✅ MOSTLY COMPLETE
295
+ 1. ✅ `src/cli/commands/config-cmd.ts` - Add summarization - COMPLETE
296
+ 2. ✅ `README.md` - Add config overview - COMPLETE
297
+ 3. ⚠️ `docs/CONFIG.md` - Add troubleshooting, document .ts limitation - PARTIALLY COMPLETE (.ts documented, troubleshooting missing)
298
+ 4. ✅ `src/cli/index.ts` or help generator - Add config to main help - COMPLETE
299
+
300
+ ### Should Update ⚠️ PARTIALLY COMPLETE
301
+ 1. ✅ `src/config/file-provider.ts` - Fix .ts loading or better error - ADEQUATE (documented limitation)
302
+ 2. ⏭️ JSON schema file - Create and publish - NOT YET DONE
303
+
304
+ ### Nice to Update ⏭️ DEFERRED
305
+ 1. ⏭️ `docs/019-USAGE.md` - Link to config commands
306
+ 2. ⏭️ Examples directory - Add config examples
307
+
308
+ ---
309
+
310
+ ## Conclusion
311
+
312
+ **ORIGINAL (2026-01-24 pre-fixes):**
313
+ The configuration system is fundamentally sound with excellent design and documentation. The two main issues (TypeScript loading and hidden summarization) are fixable in under a day of work.
314
+
315
+ **CURRENT STATUS (2026-01-24 post-fixes):**
316
+ ✅ Both critical issues have been FIXED. The system is now production-ready and user-friendly.
317
+
318
+ **Original Recommendation:** Fix critical issues before next release.
319
+ **Current Status:** ✅ Critical issues fixed in commit db80c90c and related commits.
320
+
321
+ **Overall Assessment (UPDATED):**
322
+ - ✅ Safe to use with JSON configs - COMPLETE
323
+ - ✅ TypeScript limitation documented, .js with JSDoc is default - COMPLETE
324
+ - ✅ Summarization section fully visible and usable - COMPLETE
325
+ - ✅ Documentation is excellent (one gap: troubleshooting section)
326
+
327
+ **Production Readiness:** 🟢 PRODUCTION READY (95% complete)
328
+
329
+ **Remaining Work:** Add troubleshooting section to CONFIG.md (~30-60 minutes)
330
+
331
+ ---
332
+
333
+ ## Post-Validation Update (2026-01-24)
334
+
335
+ After validation against actual source code, the configuration system is in excellent shape:
336
+
337
+ **Fixes Implemented:**
338
+ - ✅ Default format changed to `.js` with JSDoc types
339
+ - ✅ TypeScript limitation clearly documented
340
+ - ✅ Summarization exposed in all locations (init, check, JSON/JS formats)
341
+ - ✅ README updated with comprehensive config section
342
+ - ✅ Main help includes config commands
343
+ - ✅ All critical P0 tasks complete
344
+ - ✅ Most important P1 tasks complete
345
+
346
+ **Only Remaining Task:**
347
+ - Add troubleshooting section to CONFIG.md (content ready in TODO.md)
348
+
349
+ **Quality Assessment:**
350
+ - Implementation: A (excellent, all fixes done)
351
+ - Documentation: B+ (very good, missing troubleshooting)
352
+ - User Experience: A- (clear, discoverable, working defaults)
353
+
354
+ ---
355
+
356
+ For detailed analysis, see [analysis.md](./analysis.md)
357
+ For validation results, see [fix-validation.md](./fix-validation.md)