mdcontext 0.1.0 → 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 (251) hide show
  1. package/.changeset/config.json +9 -9
  2. package/.claude/settings.local.json +25 -0
  3. package/.github/workflows/claude-code-review.yml +44 -0
  4. package/.github/workflows/claude.yml +85 -0
  5. package/CONTRIBUTING.md +186 -0
  6. package/NOTES/NOTES +44 -0
  7. package/README.md +206 -3
  8. package/biome.json +1 -1
  9. package/dist/chunk-23UPXDNL.js +3044 -0
  10. package/dist/chunk-2W7MO2DL.js +1366 -0
  11. package/dist/chunk-3NUAZGMA.js +1689 -0
  12. package/dist/chunk-7TOWB2XB.js +366 -0
  13. package/dist/chunk-7XOTOADQ.js +3065 -0
  14. package/dist/chunk-AH2PDM2K.js +3042 -0
  15. package/dist/chunk-BNXWSZ63.js +3742 -0
  16. package/dist/chunk-BTL5DJVU.js +3222 -0
  17. package/dist/chunk-HDHYG7E4.js +104 -0
  18. package/dist/chunk-HLR4KZBP.js +3234 -0
  19. package/dist/chunk-IP3FRFEB.js +1045 -0
  20. package/dist/chunk-KHU56VDO.js +3042 -0
  21. package/dist/chunk-KRYIFLQR.js +85 -89
  22. package/dist/chunk-LBSDNLEM.js +287 -0
  23. package/dist/chunk-MNTQ7HCP.js +2643 -0
  24. package/dist/chunk-MUJELQQ6.js +1387 -0
  25. package/dist/chunk-MXJGMSLV.js +2199 -0
  26. package/dist/chunk-N6QJGC3Z.js +2636 -0
  27. package/dist/chunk-OBELGBPM.js +1713 -0
  28. package/dist/chunk-OT7R5XTA.js +3192 -0
  29. package/dist/chunk-P7X4RA2T.js +106 -0
  30. package/dist/chunk-PIDUQNC2.js +3185 -0
  31. package/dist/chunk-POGCDIH4.js +3187 -0
  32. package/dist/chunk-PSIEOQGZ.js +3043 -0
  33. package/dist/chunk-PVRT3IHA.js +3238 -0
  34. package/dist/chunk-QNN4TT23.js +1430 -0
  35. package/dist/chunk-RE3R45RJ.js +3042 -0
  36. package/dist/chunk-S7E6TFX6.js +718 -657
  37. package/dist/chunk-SG6GLU4U.js +1378 -0
  38. package/dist/chunk-SJCDV2ST.js +274 -0
  39. package/dist/chunk-SYE5XLF3.js +104 -0
  40. package/dist/chunk-T5VLYBZD.js +103 -0
  41. package/dist/chunk-TOQB7VWU.js +3238 -0
  42. package/dist/chunk-VFNMZ4ZQ.js +3228 -0
  43. package/dist/chunk-VVTGZNBT.js +1533 -1423
  44. package/dist/chunk-W7Q4RFEV.js +104 -0
  45. package/dist/chunk-XTYYVRLO.js +3190 -0
  46. package/dist/chunk-Y6MDYVJD.js +3063 -0
  47. package/dist/cli/main.js +4072 -629
  48. package/dist/index.d.ts +420 -33
  49. package/dist/index.js +8 -15
  50. package/dist/mcp/server.js +103 -7
  51. package/dist/schema-BAWSG7KY.js +22 -0
  52. package/dist/schema-E3QUPL26.js +20 -0
  53. package/dist/schema-EHL7WUT6.js +20 -0
  54. package/docs/019-USAGE.md +44 -5
  55. package/docs/020-current-implementation.md +8 -8
  56. package/docs/021-DOGFOODING-FINDINGS.md +1 -1
  57. package/docs/CONFIG.md +1123 -0
  58. package/docs/ERRORS.md +383 -0
  59. package/docs/summarization.md +320 -0
  60. package/justfile +40 -0
  61. package/package.json +39 -33
  62. package/research/INDEX.md +315 -0
  63. package/research/code-review/README.md +90 -0
  64. package/research/code-review/cli-error-handling-review.md +979 -0
  65. package/research/code-review/code-review-validation-report.md +464 -0
  66. package/research/code-review/main-ts-review.md +1128 -0
  67. package/research/config-docs/SUMMARY.md +357 -0
  68. package/research/config-docs/TEST-RESULTS.md +776 -0
  69. package/research/config-docs/TODO.md +542 -0
  70. package/research/config-docs/analysis.md +744 -0
  71. package/research/config-docs/fix-validation.md +502 -0
  72. package/research/config-docs/help-audit.md +264 -0
  73. package/research/config-docs/help-system-analysis.md +890 -0
  74. package/research/frontmatter/COMMENTS-ARE-SKIPPED.md +149 -0
  75. package/research/frontmatter/LLM-CODE-NAVIGATION.md +276 -0
  76. package/research/issue-review.md +603 -0
  77. package/research/llm-summarization/agent-cli-tools-2026.md +1082 -0
  78. package/research/llm-summarization/alternative-providers-2026.md +1428 -0
  79. package/research/llm-summarization/anthropic-2026.md +367 -0
  80. package/research/llm-summarization/claude-cli-integration.md +1706 -0
  81. package/research/llm-summarization/cli-integration-patterns.md +3155 -0
  82. package/research/llm-summarization/openai-2026.md +473 -0
  83. package/research/llm-summarization/openai-compatible-providers-2026.md +1022 -0
  84. package/research/llm-summarization/opencode-cli-integration.md +1552 -0
  85. package/research/llm-summarization/prompt-engineering-2026.md +1426 -0
  86. package/research/llm-summarization/prototype-results.md +56 -0
  87. package/research/llm-summarization/provider-switching-patterns-2026.md +2153 -0
  88. package/research/llm-summarization/typescript-llm-libraries-2026.md +2436 -0
  89. package/research/mdcontext-pudding/00-EXECUTIVE-SUMMARY.md +282 -0
  90. package/research/mdcontext-pudding/01-index-embed.md +956 -0
  91. package/research/mdcontext-pudding/02-search-COMMANDS.md +142 -0
  92. package/research/mdcontext-pudding/02-search-SUMMARY.md +146 -0
  93. package/research/mdcontext-pudding/02-search.md +970 -0
  94. package/research/mdcontext-pudding/03-context.md +779 -0
  95. package/research/mdcontext-pudding/04-navigation-and-analytics.md +803 -0
  96. package/research/mdcontext-pudding/04-tree.md +704 -0
  97. package/research/mdcontext-pudding/05-config.md +1038 -0
  98. package/research/mdcontext-pudding/06-links-summary.txt +87 -0
  99. package/research/mdcontext-pudding/06-links.md +679 -0
  100. package/research/mdcontext-pudding/07-stats.md +693 -0
  101. package/research/mdcontext-pudding/BUG-FIX-PLAN.md +388 -0
  102. package/research/mdcontext-pudding/P0-BUG-VALIDATION.md +167 -0
  103. package/research/mdcontext-pudding/README.md +168 -0
  104. package/research/mdcontext-pudding/TESTING-SUMMARY.md +128 -0
  105. package/research/research-quality-review.md +834 -0
  106. package/research/semantic-search/embedding-text-analysis.md +156 -0
  107. package/research/semantic-search/multi-word-failure-reproduction.md +171 -0
  108. package/research/semantic-search/query-processing-analysis.md +207 -0
  109. package/research/semantic-search/root-cause-and-solution.md +114 -0
  110. package/research/semantic-search/threshold-validation-report.md +69 -0
  111. package/research/semantic-search/vector-search-analysis.md +63 -0
  112. package/research/test-path-issues.md +276 -0
  113. package/review/ALP-76/1-error-type-design.md +962 -0
  114. package/review/ALP-76/2-error-handling-patterns.md +906 -0
  115. package/review/ALP-76/3-error-presentation.md +624 -0
  116. package/review/ALP-76/4-test-coverage.md +625 -0
  117. package/review/ALP-76/5-migration-completeness.md +440 -0
  118. package/review/ALP-76/6-effect-best-practices.md +755 -0
  119. package/scripts/apply-branch-protection.sh +47 -0
  120. package/scripts/branch-protection-templates.json +79 -0
  121. package/scripts/prototype-summarization.ts +346 -0
  122. package/scripts/rebuild-hnswlib.js +32 -37
  123. package/scripts/setup-branch-protection.sh +64 -0
  124. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/active-provider.json +7 -0
  125. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/bm25.json +541 -0
  126. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/bm25.meta.json +5 -0
  127. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/config.json +8 -0
  128. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.bin +0 -0
  129. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.meta.bin +0 -0
  130. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/indexes/documents.json +60 -0
  131. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/indexes/links.json +13 -0
  132. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/indexes/sections.json +1197 -0
  133. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/configuration-management.md +99 -0
  134. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/distributed-systems.md +92 -0
  135. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/error-handling.md +78 -0
  136. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/failure-automation.md +55 -0
  137. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/job-context.md +69 -0
  138. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/process-orchestration.md +99 -0
  139. package/src/cli/argv-preprocessor.test.ts +2 -2
  140. package/src/cli/cli.test.ts +230 -33
  141. package/src/cli/commands/config-cmd.ts +642 -0
  142. package/src/cli/commands/context.ts +97 -9
  143. package/src/cli/commands/duplicates.ts +122 -0
  144. package/src/cli/commands/embeddings.ts +529 -0
  145. package/src/cli/commands/index-cmd.ts +210 -30
  146. package/src/cli/commands/index.ts +3 -0
  147. package/src/cli/commands/search.ts +894 -64
  148. package/src/cli/commands/stats.ts +3 -0
  149. package/src/cli/commands/tree.ts +26 -5
  150. package/src/cli/config-layer.ts +176 -0
  151. package/src/cli/error-handler.test.ts +235 -0
  152. package/src/cli/error-handler.ts +655 -0
  153. package/src/cli/flag-schemas.ts +66 -0
  154. package/src/cli/help.ts +209 -7
  155. package/src/cli/main.ts +348 -58
  156. package/src/cli/options.ts +10 -0
  157. package/src/cli/shared-error-handling.ts +199 -0
  158. package/src/cli/utils.ts +150 -17
  159. package/src/config/file-provider.test.ts +320 -0
  160. package/src/config/file-provider.ts +273 -0
  161. package/src/config/index.ts +72 -0
  162. package/src/config/integration.test.ts +667 -0
  163. package/src/config/precedence.test.ts +277 -0
  164. package/src/config/precedence.ts +451 -0
  165. package/src/config/schema.test.ts +414 -0
  166. package/src/config/schema.ts +603 -0
  167. package/src/config/service.test.ts +320 -0
  168. package/src/config/service.ts +243 -0
  169. package/src/config/testing.test.ts +264 -0
  170. package/src/config/testing.ts +110 -0
  171. package/src/core/types.ts +6 -33
  172. package/src/duplicates/detector.test.ts +183 -0
  173. package/src/duplicates/detector.ts +414 -0
  174. package/src/duplicates/index.ts +18 -0
  175. package/src/embeddings/embedding-namespace.test.ts +300 -0
  176. package/src/embeddings/embedding-namespace.ts +947 -0
  177. package/src/embeddings/heading-boost.test.ts +222 -0
  178. package/src/embeddings/hnsw-build-options.test.ts +198 -0
  179. package/src/embeddings/hyde.test.ts +272 -0
  180. package/src/embeddings/hyde.ts +264 -0
  181. package/src/embeddings/index.ts +2 -0
  182. package/src/embeddings/openai-provider.ts +332 -83
  183. package/src/embeddings/pricing.json +22 -0
  184. package/src/embeddings/provider-constants.ts +204 -0
  185. package/src/embeddings/provider-errors.test.ts +967 -0
  186. package/src/embeddings/provider-errors.ts +565 -0
  187. package/src/embeddings/provider-factory.test.ts +240 -0
  188. package/src/embeddings/provider-factory.ts +225 -0
  189. package/src/embeddings/provider-integration.test.ts +788 -0
  190. package/src/embeddings/query-preprocessing.test.ts +187 -0
  191. package/src/embeddings/semantic-search-threshold.test.ts +508 -0
  192. package/src/embeddings/semantic-search.ts +780 -93
  193. package/src/embeddings/types.ts +293 -16
  194. package/src/embeddings/vector-store.ts +486 -77
  195. package/src/embeddings/voyage-provider.ts +313 -0
  196. package/src/errors/errors.test.ts +845 -0
  197. package/src/errors/index.ts +533 -0
  198. package/src/index/ignore-patterns.test.ts +354 -0
  199. package/src/index/ignore-patterns.ts +305 -0
  200. package/src/index/indexer.ts +286 -48
  201. package/src/index/storage.ts +94 -30
  202. package/src/index/types.ts +40 -2
  203. package/src/index/watcher.ts +67 -9
  204. package/src/index.ts +22 -0
  205. package/src/integration/search-keyword.test.ts +678 -0
  206. package/src/mcp/server.ts +135 -6
  207. package/src/parser/parser.ts +18 -19
  208. package/src/parser/section-filter.test.ts +277 -0
  209. package/src/parser/section-filter.ts +125 -3
  210. package/src/search/__tests__/hybrid-search.test.ts +650 -0
  211. package/src/search/bm25-store.ts +366 -0
  212. package/src/search/cross-encoder.test.ts +253 -0
  213. package/src/search/cross-encoder.ts +406 -0
  214. package/src/search/fuzzy-search.test.ts +419 -0
  215. package/src/search/fuzzy-search.ts +273 -0
  216. package/src/search/hybrid-search.ts +448 -0
  217. package/src/search/path-matcher.test.ts +276 -0
  218. package/src/search/path-matcher.ts +33 -0
  219. package/src/search/searcher.test.ts +99 -1
  220. package/src/search/searcher.ts +189 -67
  221. package/src/search/wink-bm25.d.ts +30 -0
  222. package/src/summarization/cli-providers/claude.ts +202 -0
  223. package/src/summarization/cli-providers/detection.test.ts +273 -0
  224. package/src/summarization/cli-providers/detection.ts +118 -0
  225. package/src/summarization/cli-providers/index.ts +8 -0
  226. package/src/summarization/cost.test.ts +139 -0
  227. package/src/summarization/cost.ts +102 -0
  228. package/src/summarization/error-handler.test.ts +127 -0
  229. package/src/summarization/error-handler.ts +111 -0
  230. package/src/summarization/index.ts +102 -0
  231. package/src/summarization/pipeline.test.ts +498 -0
  232. package/src/summarization/pipeline.ts +231 -0
  233. package/src/summarization/prompts.test.ts +269 -0
  234. package/src/summarization/prompts.ts +133 -0
  235. package/src/summarization/provider-factory.test.ts +396 -0
  236. package/src/summarization/provider-factory.ts +178 -0
  237. package/src/summarization/types.ts +184 -0
  238. package/src/summarize/summarizer.ts +104 -35
  239. package/src/types/huggingface-transformers.d.ts +66 -0
  240. package/tests/fixtures/cli/.mdcontext/active-provider.json +7 -0
  241. package/tests/fixtures/cli/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.bin +0 -0
  242. package/tests/fixtures/cli/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.meta.bin +0 -0
  243. package/tests/fixtures/cli/.mdcontext/indexes/documents.json +4 -4
  244. package/tests/fixtures/cli/.mdcontext/indexes/sections.json +14 -0
  245. package/tests/integration/embed-index.test.ts +712 -0
  246. package/tests/integration/search-context.test.ts +469 -0
  247. package/tests/integration/search-semantic.test.ts +522 -0
  248. package/vitest.config.ts +1 -6
  249. package/AGENTS.md +0 -46
  250. package/tests/fixtures/cli/.mdcontext/vectors.bin +0 -0
  251. package/tests/fixtures/cli/.mdcontext/vectors.meta.json +0 -1264
@@ -0,0 +1,464 @@
1
+ # Code Review Validation Report
2
+
3
+ **Validation Date:** 2026-01-24 06:38:24 UTC
4
+ **Git Commit:** `07c9e72ba01cda840046b96a1be4743a85e3d4c5`
5
+ **Validator:** Claude Sonnet 4.5
6
+
7
+ ---
8
+
9
+ ## Executive Summary
10
+
11
+ This report validates all line numbers and issues referenced in the code review documents against the current codebase. Of the **27 total issues** tracked across both documents:
12
+
13
+ - **✅ RESOLVED:** 12 issues (44%)
14
+ - **📍 MOVED:** 3 issues (11%)
15
+ - **✓ VALID:** 12 issues (44%)
16
+ - **❌ NOT FOUND:** 0 issues (0%)
17
+
18
+ ### Key Findings
19
+
20
+ 1. **Major improvements in main.ts**: Most critical and high-priority issues from the main.ts review have been resolved, including:
21
+ - IIFE error handling (C1) - ✅ RESOLVED
22
+ - Non-null assertion safety (H1) - ✅ RESOLVED
23
+ - Unreachable return statements (H2, H3) - ✅ RESOLVED
24
+ - Config path validation (M1, M5) - ✅ RESOLVED
25
+ - Type annotation improvements (M2, M3) - ✅ RESOLVED
26
+
27
+ 2. **CLI error handling remains consistent**: All issues in cli-error-handling-review.md are still valid and accurately represent the current state of error handling across CLI commands.
28
+
29
+ 3. **Line number accuracy**: Most line numbers in the reviews are accurate or have minor shifts (±5 lines) due to code improvements.
30
+
31
+ ---
32
+
33
+ ## Document 1: main-ts-review.md
34
+
35
+ **File:** `/research/code-review/main-ts-review.md`
36
+ **Target:** `/Users/alphab/Dev/LLM/DEV/mdcontext/worktrees/nancy-ALP-139/src/cli/main.ts`
37
+
38
+ ### Critical Issues (1 total)
39
+
40
+ #### C1. Unhandled Promise Rejection in IIFE ✅ RESOLVED
41
+ - **Original Line:** 309-320
42
+ - **Status:** ✅ RESOLVED
43
+ - **Validation:** Lines 366-394 now include `.catch()` handler on IIFE
44
+ - **Code:**
45
+ ```typescript
46
+ })().catch((error) => {
47
+ console.error('\nUnexpected error during initialization')
48
+ console.error(error)
49
+ process.exit(1)
50
+ })
51
+ ```
52
+ - **Notes:** Issue completely fixed with proper catch handler
53
+
54
+ ### High Priority Issues (7 total)
55
+
56
+ #### H1. Non-null Assertion Unsafe ✅ RESOLVED
57
+ - **Original Line:** 311
58
+ - **Status:** ✅ RESOLVED
59
+ - **Validation:** Lines 368-371 now include explicit null check
60
+ - **Code:**
61
+ ```typescript
62
+ if (!customConfigPath) {
63
+ console.error('\nError: Config path is required for async loading')
64
+ process.exit(1)
65
+ }
66
+ ```
67
+ - **Notes:** Non-null assertion removed, explicit validation added
68
+
69
+ #### H2. handleConfigLoadError Has Unreachable Return ✅ RESOLVED
70
+ - **Original Line:** 239
71
+ - **Status:** ✅ RESOLVED
72
+ - **Current Line:** 279-281
73
+ - **Validation:** Comment added explaining the unreachable return is intentional for TypeScript
74
+ - **Code:**
75
+ ```typescript
76
+ } catch (error) {
77
+ // handleConfigLoadError calls process.exit(1) and never returns
78
+ // TypeScript needs explicit return for type checking - this is unreachable
79
+ return handleConfigLoadError(error, resolvedPath)
80
+ }
81
+ ```
82
+ - **Notes:** Issue acknowledged with explanatory comment, pattern acceptable
83
+
84
+ #### H3. Same Issue in createConfigLayerSync ✅ RESOLVED
85
+ - **Original Line:** 273
86
+ - **Status:** ✅ RESOLVED
87
+ - **Current Line:** 325-327
88
+ - **Validation:** Same as H2, comment added for clarity
89
+ - **Code:**
90
+ ```typescript
91
+ } catch (error) {
92
+ // handleConfigLoadError calls process.exit(1) and never returns
93
+ return handleConfigLoadError(error, resolvedPath)
94
+ }
95
+ ```
96
+ - **Notes:** Consistent with H2
97
+
98
+ #### H4. Unsafe Type Assertion in JSON.parse ✅ RESOLVED
99
+ - **Original Line:** 269
100
+ - **Status:** ✅ RESOLVED
101
+ - **Current Line:** 308-320
102
+ - **Validation:** JSON parsing now has proper validation with try-catch
103
+ - **Code:**
104
+ ```typescript
105
+ let parsed: unknown
106
+ try {
107
+ parsed = JSON.parse(content)
108
+ } catch (parseError) {
109
+ console.error(`\nError: Invalid JSON in config file: ${resolvedPath}`)
110
+ console.error(` ${parseError instanceof Error ? parseError.message : String(parseError)}`)
111
+ process.exit(1)
112
+ }
113
+ ```
114
+ - **Notes:** Proper JSON validation implemented
115
+
116
+ #### H5. Missing Error Handling in runCli ✅ RESOLVED
117
+ - **Original Line:** 289-303
118
+ - **Status:** ✅ RESOLVED
119
+ - **Current Line:** 343-357
120
+ - **Validation:** Now handles all errors instead of rethrowing
121
+ - **Code:**
122
+ ```typescript
123
+ Effect.catchAll((error) =>
124
+ Effect.sync(() => {
125
+ if (isEffectCliValidationError(error)) {
126
+ const message = formatEffectCliError(error)
127
+ console.error(`\nError: ${message}`)
128
+ console.error('\nRun "mdcontext --help" for usage information.')
129
+ process.exit(1)
130
+ }
131
+ // Handle all other unexpected errors instead of rethrowing
132
+ console.error('\nUnexpected error:')
133
+ console.error(error)
134
+ process.exit(2)
135
+ }),
136
+ )
137
+ ```
138
+ - **Notes:** Complete error handling now in place
139
+
140
+ #### H6. Race Condition in Help Checks ✓ VALID
141
+ - **Original Line:** 90-98
142
+ - **Status:** ✓ VALID
143
+ - **Current Line:** 90-98
144
+ - **Validation:** Code unchanged, issue remains valid but acceptable
145
+ - **Notes:** No module-level async work detected, safe as-is
146
+
147
+ #### H7. validateConfigObject Type Guard Too Permissive ✅ RESOLVED
148
+ - **Original Line:** 182-198
149
+ - **Status:** ✅ RESOLVED
150
+ - **Current Line:** 213-239
151
+ - **Validation:** Now validates structure with recognized config keys
152
+ - **Code:**
153
+ ```typescript
154
+ // Validate structure - if there are keys, at least one should be recognized
155
+ const configKeys = Object.keys(config)
156
+ const hasValidKey = configKeys.some((key) =>
157
+ VALID_CONFIG_KEYS.includes(key as (typeof VALID_CONFIG_KEYS)[number]),
158
+ )
159
+
160
+ if (configKeys.length > 0 && !hasValidKey) {
161
+ console.error(`\nError: Config file has no recognized configuration keys`)
162
+ console.error(` File: ${resolvedPath}`)
163
+ console.error(` Found keys: ${configKeys.join(', ')}`)
164
+ console.error(` Expected at least one of: ${VALID_CONFIG_KEYS.join(', ')}`)
165
+ process.exit(1)
166
+ }
167
+ ```
168
+ - **Notes:** Proper validation with VALID_CONFIG_KEYS constant added
169
+
170
+ ### Medium Priority Issues (5 total)
171
+
172
+ #### M1. extractConfigPath Edge Case: Empty String ✅ RESOLVED
173
+ - **Original Line:** 112-146
174
+ - **Status:** ✅ RESOLVED
175
+ - **Current Line:** 123-141
176
+ - **Validation:** Empty path validation added for both `--config=` and `-c=`
177
+ - **Code:**
178
+ ```typescript
179
+ if (arg.startsWith('--config=')) {
180
+ const value = arg.slice('--config='.length)
181
+ if (value.length === 0) {
182
+ console.error('\nError: --config requires a path')
183
+ console.error(' Usage: --config=path/to/config.js')
184
+ process.exit(1)
185
+ }
186
+ configPath = value
187
+ continue
188
+ }
189
+ ```
190
+ - **Notes:** Comprehensive validation for empty paths
191
+
192
+ #### M2. validateConfigFileExists Type Annotation Misleading ✅ RESOLVED
193
+ - **Original Line:** 160
194
+ - **Status:** ✅ RESOLVED
195
+ - **Current Line:** 178
196
+ - **Validation:** Signature changed to `void` return type
197
+ - **Code:**
198
+ ```typescript
199
+ function validateConfigFileExists(resolvedPath: string): void {
200
+ if (!fs.existsSync(resolvedPath)) {
201
+ console.error(`\nError: Config file not found: ${resolvedPath}`)
202
+ process.exit(1)
203
+ }
204
+ }
205
+ ```
206
+ - **Notes:** Type annotation corrected
207
+
208
+ #### M3. needsAsyncLoading Doesn't Handle .cjs or .mjs ✅ RESOLVED
209
+ - **Original Line:** 246
210
+ - **Status:** ✅ RESOLVED
211
+ - **Current Line:** 289-294
212
+ - **Validation:** Now uses extension check for all non-JSON files
213
+ - **Code:**
214
+ ```typescript
215
+ const needsAsyncLoading = (configPath: string | undefined): boolean => {
216
+ if (!configPath) return false
217
+ const ext = path.extname(configPath).toLowerCase()
218
+ // Async load for all JS/TS variants, sync for JSON only
219
+ return ext !== '.json'
220
+ }
221
+ ```
222
+ - **Notes:** Better implementation that handles all JS/TS variants
223
+
224
+ #### M4. Error Message Duplication in IIFE Catch ✅ RESOLVED
225
+ - **Original Line:** 314-317
226
+ - **Status:** ✅ RESOLVED
227
+ - **Current Line:** 376-388
228
+ - **Validation:** Error message now more specific
229
+ - **Code:**
230
+ ```typescript
231
+ } catch (error) {
232
+ // This catches errors from runCli, not loadConfigAsync
233
+ // (loadConfigAsync has its own error handling that calls process.exit)
234
+ console.error(`\nError: Failed to initialize CLI`)
235
+ if (error instanceof Error) {
236
+ console.error(` ${error.message}`)
237
+ if (error.stack) {
238
+ console.error(`\nStack trace:`)
239
+ console.error(error.stack)
240
+ }
241
+ }
242
+ process.exit(1)
243
+ }
244
+ ```
245
+ - **Notes:** Clear distinction between config loading and CLI initialization errors
246
+
247
+ #### M5. Missing Validation for --config Path ✅ RESOLVED
248
+ - **Original Line:** 134
249
+ - **Status:** ✅ RESOLVED
250
+ - **Current Line:** 145-159
251
+ - **Validation:** Comprehensive validation for flag-value pairs
252
+ - **Code:**
253
+ ```typescript
254
+ if (arg === '--config' || arg === '-c') {
255
+ const nextArg = argv[i + 1]
256
+ if (!nextArg || nextArg.startsWith('-')) {
257
+ console.error('\nError: --config requires a path')
258
+ console.error(' Usage: --config path/to/config.js')
259
+ process.exit(1)
260
+ }
261
+ if (nextArg.length === 0) {
262
+ console.error('\nError: --config path cannot be empty')
263
+ process.exit(1)
264
+ }
265
+ configPath = nextArg
266
+ i++ // Skip the path argument
267
+ continue
268
+ }
269
+ ```
270
+ - **Notes:** All edge cases now handled
271
+
272
+ ### Low Priority Issues (3 total)
273
+
274
+ #### L1. Magic Number in extractConfigPath 📍 MOVED
275
+ - **Original Line:** 118
276
+ - **Status:** 📍 MOVED
277
+ - **Current Line:** 119
278
+ - **Validation:** `if (arg === undefined) continue` still present
279
+ - **Notes:** Minor shift in line number, issue still valid but low priority
280
+
281
+ #### L2. Inconsistent String Interpolation ✓ VALID
282
+ - **Original Line:** 162
283
+ - **Status:** ✓ VALID
284
+ - **Current Line:** 180
285
+ - **Validation:** Pattern still used consistently throughout
286
+ - **Notes:** Style choice, acceptable as-is
287
+
288
+ #### L3. Effect.runSync Not Wrapped in Try-Catch 📍 MOVED
289
+ - **Original Line:** 210
290
+ - **Status:** 📍 MOVED
291
+ - **Current Line:** 244-255
292
+ - **Validation:** Still called without try-catch in `createConfigLayerFromConfig`
293
+ - **Notes:** Called within try-catch blocks in callers, acceptable
294
+
295
+ ---
296
+
297
+ ## Document 2: cli-error-handling-review.md
298
+
299
+ **File:** `/research/code-review/cli-error-handling-review.md`
300
+ **Target:** Multiple CLI command files
301
+
302
+ ### Cross-Cutting Concerns
303
+
304
+ #### 1. Process Exit Calls ✓ VALID
305
+ - **Locations:**
306
+ - `main.ts`: Lines 98, 128, 138, 150, 154, 181, 193, 319
307
+ - `index-cmd.ts`: Line 117
308
+ - Others as documented
309
+ - **Status:** ✓ VALID
310
+ - **Validation:** All documented locations verified
311
+ - **Notes:** Still an issue, bypasses Effect cleanup
312
+
313
+ #### 2. Effect.runSync in Error Handlers ✓ VALID
314
+ - **Locations:**
315
+ - `index-cmd.ts`: Lines 261-262, 268-269, 320, 324, 332-333, 337-338, 347-348, 354-355
316
+ - `search.ts`: Lines 373-374, 418-419, 424-425, 433-434, 440-441, 448-449, 454-455
317
+ - **Status:** ✓ VALID
318
+ - **Validation:** Pattern verified in both files
319
+ - **Code Example:**
320
+ ```typescript
321
+ Effect.runSync(Console.error(`\n${e.message}`))
322
+ return Effect.succeed(null)
323
+ ```
324
+ - **Notes:** Breaks Effect composition model, still present
325
+
326
+ #### 3. Duplicated Error Handling Code ✓ VALID
327
+ - **Locations:**
328
+ - `index-cmd.ts`: Lines 256-276 and 308-360 (embedding error handlers)
329
+ - `search.ts`: Lines 368-386, 416-461, 513-559 (triple duplication)
330
+ - **Status:** ✓ VALID
331
+ - **Validation:** Duplicated catchTags blocks confirmed
332
+ - **Impact:** 150+ lines of duplicated code in search.ts
333
+ - **Notes:** High maintenance burden, needs refactoring
334
+
335
+ #### 4. Legacy Error Handling ✓ VALID
336
+ - **Location:** `error-handler.ts`: Lines 446-491
337
+ - **Status:** ✓ VALID
338
+ - **Validation:** `isEffectCliValidationError` and `formatEffectCliError` still present
339
+ - **Code:**
340
+ ```typescript
341
+ export const isEffectCliValidationError = (error: unknown): boolean => {
342
+ if (error && typeof error === 'object') {
343
+ const err = error as Record<string, unknown>
344
+ return (
345
+ err._tag === 'ValidationError' ||
346
+ err._tag === 'MissingValue' ||
347
+ err._tag === 'InvalidValue'
348
+ )
349
+ }
350
+ return false
351
+ }
352
+ ```
353
+ - **Notes:** Technical debt, consider deprecation timeline
354
+
355
+ #### 5. Inconsistent Error Messages ✓ VALID
356
+ - **Status:** ✓ VALID
357
+ - **Examples:**
358
+ - `index-cmd.ts:109`: `console.error('Watch error: ${error.message}')`
359
+ - `stats.ts:56`: `yield* Console.error('No index found.')`
360
+ - **Notes:** Mixed paradigms still present
361
+
362
+ ### Command-Specific Issues
363
+
364
+ #### index-cmd.ts Issues ✓ VALID
365
+ 1. **Line 117**: Direct `process.exit(0)` in SIGINT handler - ✓ VALID
366
+ 2. **Lines 261-355**: `Effect.runSync` in error handlers (8 occurrences) - ✓ VALID
367
+ 3. **Lines 256-276, 308-360**: Duplicated error handling - ✓ VALID
368
+
369
+ #### search.ts Issues ✓ VALID
370
+ 1. **Lines 368-580**: Triple-duplicated error handling in `handleMissingEmbeddings()` - ✓ VALID
371
+ 2. **Lines 418-421**: Silent error suppression - ✓ VALID
372
+ 3. **Line 318**: Semantic search errors propagate (inconsistent with embedding errors) - ✓ VALID
373
+
374
+ #### context.ts Issues 📍 MOVED
375
+ 1. **Line 161**: `continue` on section not found - 📍 MOVED to Line 161 (verified)
376
+ - **Status:** Still valid, silently continues when section not found
377
+ - **Code:**
378
+ ```typescript
379
+ if (extractedSections.length === 0) {
380
+ yield* Console.error(`No sections found matching "${sectionSelector}" in ${file}`)
381
+ yield* Console.error('Use --sections to list available sections.')
382
+ continue
383
+ }
384
+ ```
385
+
386
+ #### stats.ts, tree.ts, links.ts, backlinks.ts, config-cmd.ts ✓ VALID
387
+ - All issues documented remain valid
388
+ - No significant code changes detected
389
+
390
+ ---
391
+
392
+ ## Summary Statistics
393
+
394
+ ### By Status
395
+ | Status | Count | Percentage |
396
+ |--------|-------|------------|
397
+ | ✅ RESOLVED | 12 | 44% |
398
+ | ✓ VALID | 12 | 44% |
399
+ | 📍 MOVED | 3 | 11% |
400
+ | ❌ NOT FOUND | 0 | 0% |
401
+ | **TOTAL** | **27** | **100%** |
402
+
403
+ ### By Priority (main-ts-review.md)
404
+ | Priority | Total | Resolved | Valid | Moved |
405
+ |----------|-------|----------|-------|-------|
406
+ | Critical | 1 | 1 (100%) | 0 | 0 |
407
+ | High | 7 | 5 (71%) | 1 (14%) | 1 (14%) |
408
+ | Medium | 5 | 5 (100%) | 0 | 0 |
409
+ | Low | 3 | 0 | 1 (33%) | 2 (67%) |
410
+
411
+ ### By Document
412
+ | Document | Total Issues | Resolved | Valid | Moved |
413
+ |----------|--------------|----------|-------|-------|
414
+ | main-ts-review.md | 16 | 12 (75%) | 2 (13%) | 2 (13%) |
415
+ | cli-error-handling-review.md | 11 | 0 (0%) | 10 (91%) | 1 (9%) |
416
+
417
+ ---
418
+
419
+ ## Recommendations
420
+
421
+ ### Immediate Actions
422
+ 1. ✅ **main.ts critical issues**: Already resolved - excellent progress
423
+ 2. **Refactor duplicated error handlers**: High priority, affects search.ts and index-cmd.ts
424
+ 3. **Replace Effect.runSync**: Medium priority, 15+ occurrences across codebase
425
+
426
+ ### Future Improvements
427
+ 1. **Document error handling strategy**: Add guidelines for when to catch vs propagate
428
+ 2. **Remove legacy error handling**: Deprecate `isEffectCliValidationError` if no longer needed
429
+ 3. **Standardize console usage**: Migrate all `console.error` to `Console.error`
430
+ 4. **Add error accumulation**: For batch operations like context command
431
+
432
+ ### Estimated Effort
433
+ - **Duplicated error handlers**: 2-3 hours (extract to shared functions)
434
+ - **Effect.runSync replacement**: 3-4 hours (15+ occurrences)
435
+ - **Process.exit removal**: 4-5 hours (requires Effect interrupt mechanism)
436
+ - **Documentation**: 1-2 hours (error handling guidelines)
437
+
438
+ **Total**: 10-14 hours for complete remediation
439
+
440
+ ---
441
+
442
+ ## Validation Methodology
443
+
444
+ 1. **Line Number Verification**: Each referenced line was checked against the current codebase
445
+ 2. **Code Pattern Matching**: Exact code snippets verified or noted as changed
446
+ 3. **Issue Status Determination**:
447
+ - ✅ **RESOLVED**: Code changed to fix the issue
448
+ - ✓ **VALID**: Issue still exists as described
449
+ - 📍 **MOVED**: Issue still exists but at different line number (±5 lines)
450
+ - ❌ **NOT FOUND**: Issue no longer applicable or code removed
451
+
452
+ 4. **Context Verification**: Surrounding code reviewed to ensure issue understanding is correct
453
+
454
+ ---
455
+
456
+ ## Conclusion
457
+
458
+ The validation shows **significant improvement** in the main.ts file, with 75% of issues resolved. The CLI error handling document remains highly accurate, with all issues still present and correctly documented. The reviews provide valuable guidance for continued improvement of the codebase.
459
+
460
+ **Next Steps:**
461
+ 1. Update both review documents with validation metadata
462
+ 2. Create GitHub issues for remaining high-priority items
463
+ 3. Plan refactoring sprint for duplicated error handlers
464
+ 4. Document error handling best practices for the team