@dizzlkheinz/ynab-mcpb 0.18.3 → 0.19.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/CHANGELOG.md +17 -0
- package/CLAUDE.md +87 -8
- package/bin/ynab-mcp-server.cjs +2 -2
- package/bin/ynab-mcp-server.js +3 -3
- package/biome.json +39 -0
- package/dist/bundle/index.cjs +67 -67
- package/dist/index.d.ts +1 -1
- package/dist/index.js +27 -27
- package/dist/server/YNABMCPServer.d.ts +3 -4
- package/dist/server/YNABMCPServer.js +111 -116
- package/dist/server/budgetResolver.d.ts +6 -5
- package/dist/server/budgetResolver.js +46 -36
- package/dist/server/cacheKeys.js +6 -6
- package/dist/server/cacheManager.js +14 -11
- package/dist/server/completions.d.ts +2 -2
- package/dist/server/completions.js +20 -15
- package/dist/server/config.d.ts +10 -5
- package/dist/server/config.js +24 -7
- package/dist/server/deltaCache.d.ts +2 -2
- package/dist/server/deltaCache.js +22 -16
- package/dist/server/deltaCache.merge.d.ts +2 -2
- package/dist/server/diagnostics.d.ts +4 -4
- package/dist/server/diagnostics.js +38 -32
- package/dist/server/errorHandler.d.ts +5 -12
- package/dist/server/errorHandler.js +219 -217
- package/dist/server/prompts.d.ts +2 -2
- package/dist/server/prompts.js +45 -45
- package/dist/server/rateLimiter.js +4 -4
- package/dist/server/requestLogger.d.ts +1 -1
- package/dist/server/requestLogger.js +40 -35
- package/dist/server/resources.d.ts +3 -3
- package/dist/server/resources.js +55 -52
- package/dist/server/responseFormatter.js +6 -6
- package/dist/server/securityMiddleware.d.ts +2 -2
- package/dist/server/securityMiddleware.js +22 -20
- package/dist/server/serverKnowledgeStore.js +1 -1
- package/dist/server/toolRegistry.d.ts +3 -3
- package/dist/server/toolRegistry.js +47 -40
- package/dist/tools/__tests__/deltaTestUtils.d.ts +3 -3
- package/dist/tools/__tests__/deltaTestUtils.js +2 -2
- package/dist/tools/accountTools.d.ts +9 -8
- package/dist/tools/accountTools.js +47 -47
- package/dist/tools/adapters.d.ts +13 -8
- package/dist/tools/adapters.js +21 -11
- package/dist/tools/budgetTools.d.ts +8 -7
- package/dist/tools/budgetTools.js +22 -22
- package/dist/tools/categoryTools.d.ts +9 -8
- package/dist/tools/categoryTools.js +68 -59
- package/dist/tools/compareTransactions/formatter.d.ts +3 -3
- package/dist/tools/compareTransactions/formatter.js +9 -9
- package/dist/tools/compareTransactions/index.d.ts +6 -6
- package/dist/tools/compareTransactions/index.js +58 -43
- package/dist/tools/compareTransactions/matcher.d.ts +1 -1
- package/dist/tools/compareTransactions/matcher.js +28 -15
- package/dist/tools/compareTransactions/parser.d.ts +2 -2
- package/dist/tools/compareTransactions/parser.js +144 -138
- package/dist/tools/compareTransactions/types.d.ts +4 -4
- package/dist/tools/compareTransactions.d.ts +1 -1
- package/dist/tools/compareTransactions.js +1 -1
- package/dist/tools/deltaFetcher.d.ts +2 -2
- package/dist/tools/deltaFetcher.js +16 -15
- package/dist/tools/deltaSupport.d.ts +4 -4
- package/dist/tools/deltaSupport.js +35 -41
- package/dist/tools/exportTransactions.d.ts +5 -4
- package/dist/tools/exportTransactions.js +61 -59
- package/dist/tools/monthTools.d.ts +7 -6
- package/dist/tools/monthTools.js +31 -29
- package/dist/tools/payeeTools.d.ts +7 -6
- package/dist/tools/payeeTools.js +28 -28
- package/dist/tools/reconcileAdapter.d.ts +2 -2
- package/dist/tools/reconcileAdapter.js +21 -11
- package/dist/tools/reconciliation/analyzer.d.ts +4 -4
- package/dist/tools/reconciliation/analyzer.js +136 -57
- package/dist/tools/reconciliation/csvParser.d.ts +3 -3
- package/dist/tools/reconciliation/csvParser.js +128 -104
- package/dist/tools/reconciliation/executor.d.ts +4 -4
- package/dist/tools/reconciliation/executor.js +148 -109
- package/dist/tools/reconciliation/index.d.ts +10 -10
- package/dist/tools/reconciliation/index.js +96 -83
- package/dist/tools/reconciliation/matcher.d.ts +3 -3
- package/dist/tools/reconciliation/matcher.js +17 -16
- package/dist/tools/reconciliation/payeeNormalizer.js +19 -8
- package/dist/tools/reconciliation/recommendationEngine.d.ts +1 -1
- package/dist/tools/reconciliation/recommendationEngine.js +40 -40
- package/dist/tools/reconciliation/reportFormatter.d.ts +2 -2
- package/dist/tools/reconciliation/reportFormatter.js +79 -54
- package/dist/tools/reconciliation/signDetector.d.ts +1 -1
- package/dist/tools/reconciliation/types.d.ts +19 -16
- package/dist/tools/reconciliation/ynabAdapter.d.ts +2 -2
- package/dist/tools/schemas/common.d.ts +1 -1
- package/dist/tools/schemas/common.js +1 -1
- package/dist/tools/schemas/outputs/accountOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/accountOutputs.js +24 -18
- package/dist/tools/schemas/outputs/budgetOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/budgetOutputs.js +14 -11
- package/dist/tools/schemas/outputs/categoryOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/categoryOutputs.js +49 -29
- package/dist/tools/schemas/outputs/comparisonOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/comparisonOutputs.js +12 -12
- package/dist/tools/schemas/outputs/index.d.ts +14 -14
- package/dist/tools/schemas/outputs/index.js +14 -14
- package/dist/tools/schemas/outputs/monthOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/monthOutputs.js +56 -41
- package/dist/tools/schemas/outputs/payeeOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/payeeOutputs.js +10 -10
- package/dist/tools/schemas/outputs/reconciliationOutputs.d.ts +2 -2
- package/dist/tools/schemas/outputs/reconciliationOutputs.js +45 -45
- package/dist/tools/schemas/outputs/transactionMutationOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/transactionMutationOutputs.js +28 -22
- package/dist/tools/schemas/outputs/transactionOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/transactionOutputs.js +43 -35
- package/dist/tools/schemas/outputs/utilityOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/utilityOutputs.js +5 -3
- package/dist/tools/schemas/shared/commonOutputs.d.ts +1 -1
- package/dist/tools/schemas/shared/commonOutputs.js +15 -9
- package/dist/tools/transactionReadTools.d.ts +11 -0
- package/dist/tools/transactionReadTools.js +202 -0
- package/dist/tools/transactionSchemas.d.ts +309 -0
- package/dist/tools/transactionSchemas.js +235 -0
- package/dist/tools/transactionTools.d.ts +6 -302
- package/dist/tools/transactionTools.js +7 -2054
- package/dist/tools/transactionUtils.d.ts +31 -0
- package/dist/tools/transactionUtils.js +364 -0
- package/dist/tools/transactionWriteTools.d.ts +20 -0
- package/dist/tools/transactionWriteTools.js +1342 -0
- package/dist/tools/utilityTools.d.ts +5 -4
- package/dist/tools/utilityTools.js +11 -11
- package/dist/types/index.d.ts +7 -7
- package/dist/types/index.js +6 -6
- package/dist/types/reconciliation.d.ts +1 -1
- package/dist/types/toolRegistration.d.ts +14 -12
- package/dist/utils/amountUtils.js +1 -1
- package/dist/utils/dateUtils.js +4 -4
- package/dist/utils/errors.d.ts +3 -3
- package/dist/utils/errors.js +4 -4
- package/dist/utils/money.d.ts +2 -2
- package/dist/utils/money.js +8 -8
- package/dist/utils/validationError.d.ts +1 -1
- package/dist/utils/validationError.js +1 -1
- package/docs/assets/examples/reconciliation-with-recommendations.json +66 -66
- package/docs/assets/schemas/reconciliation-v2.json +360 -336
- package/docs/plans/2025-12-25-transaction-tools-refactor-design.md +211 -0
- package/docs/plans/2025-12-25-transaction-tools-refactor.md +905 -0
- package/esbuild.config.mjs +53 -50
- package/meta.json +12548 -12548
- package/package.json +98 -109
- package/scripts/analyze-bundle.mjs +33 -30
- package/scripts/create-pr-description.js +169 -120
- package/scripts/run-all-tests.js +205 -0
- package/scripts/run-domain-integration-tests.js +28 -18
- package/scripts/run-generate-mcpb.js +19 -17
- package/scripts/run-throttled-integration-tests.js +92 -83
- package/scripts/test-delta-params.mjs +149 -120
- package/scripts/test-recommendations.ts +36 -32
- package/scripts/tmpTransaction.ts +80 -43
- package/scripts/validate-env.js +98 -91
- package/scripts/verify-build.js +78 -76
- package/src/__tests__/comprehensive.integration.test.ts +1281 -1154
- package/src/__tests__/performance.test.ts +723 -671
- package/src/__tests__/setup.ts +442 -395
- package/src/__tests__/smoke.e2e.test.ts +41 -39
- package/src/__tests__/testRunner.ts +314 -295
- package/src/__tests__/testUtils.ts +456 -364
- package/src/__tests__/tools/reconciliation/csvParser.integration.test.ts +109 -107
- package/src/__tests__/tools/reconciliation/real-world.integration.test.ts +41 -41
- package/src/index.ts +68 -59
- package/src/server/CLAUDE.md +480 -0
- package/src/server/YNABMCPServer.ts +821 -794
- package/src/server/__tests__/YNABMCPServer.integration.test.ts +929 -893
- package/src/server/__tests__/YNABMCPServer.test.ts +903 -899
- package/src/server/__tests__/budgetResolver.test.ts +466 -423
- package/src/server/__tests__/cacheManager.test.ts +891 -874
- package/src/server/__tests__/completions.integration.test.ts +115 -106
- package/src/server/__tests__/completions.test.ts +334 -313
- package/src/server/__tests__/config.test.ts +98 -86
- package/src/server/__tests__/deltaCache.merge.test.ts +774 -703
- package/src/server/__tests__/deltaCache.swr.test.ts +198 -153
- package/src/server/__tests__/deltaCache.test.ts +946 -759
- package/src/server/__tests__/diagnostics.test.ts +825 -792
- package/src/server/__tests__/errorHandler.integration.test.ts +512 -462
- package/src/server/__tests__/errorHandler.test.ts +402 -397
- package/src/server/__tests__/prompts.test.ts +424 -347
- package/src/server/__tests__/rateLimiter.test.ts +313 -309
- package/src/server/__tests__/requestLogger.test.ts +443 -403
- package/src/server/__tests__/resources.template.test.ts +196 -185
- package/src/server/__tests__/resources.test.ts +294 -288
- package/src/server/__tests__/security.integration.test.ts +487 -421
- package/src/server/__tests__/securityMiddleware.test.ts +519 -444
- package/src/server/__tests__/server-startup.integration.test.ts +509 -490
- package/src/server/__tests__/serverKnowledgeStore.test.ts +174 -173
- package/src/server/__tests__/toolRegistration.test.ts +239 -210
- package/src/server/__tests__/toolRegistry.test.ts +907 -845
- package/src/server/budgetResolver.ts +221 -181
- package/src/server/cacheKeys.ts +6 -6
- package/src/server/cacheManager.ts +498 -484
- package/src/server/completions.ts +267 -243
- package/src/server/config.ts +35 -14
- package/src/server/deltaCache.merge.ts +146 -128
- package/src/server/deltaCache.ts +352 -309
- package/src/server/diagnostics.ts +257 -242
- package/src/server/errorHandler.ts +747 -744
- package/src/server/prompts.ts +181 -176
- package/src/server/rateLimiter.ts +131 -129
- package/src/server/requestLogger.ts +350 -322
- package/src/server/resources.ts +442 -374
- package/src/server/responseFormatter.ts +41 -37
- package/src/server/securityMiddleware.ts +223 -205
- package/src/server/serverKnowledgeStore.ts +67 -67
- package/src/server/toolRegistry.ts +508 -474
- package/src/tools/CLAUDE.md +604 -0
- package/src/tools/__tests__/accountTools.delta.integration.test.ts +128 -111
- package/src/tools/__tests__/accountTools.integration.test.ts +129 -111
- package/src/tools/__tests__/accountTools.test.ts +685 -638
- package/src/tools/__tests__/adapters.test.ts +142 -108
- package/src/tools/__tests__/budgetTools.delta.integration.test.ts +73 -73
- package/src/tools/__tests__/budgetTools.integration.test.ts +132 -124
- package/src/tools/__tests__/budgetTools.test.ts +442 -413
- package/src/tools/__tests__/categoryTools.delta.integration.test.ts +76 -68
- package/src/tools/__tests__/categoryTools.integration.test.ts +314 -288
- package/src/tools/__tests__/categoryTools.test.ts +656 -625
- package/src/tools/__tests__/compareTransactions/formatter.test.ts +535 -462
- package/src/tools/__tests__/compareTransactions/index.test.ts +378 -358
- package/src/tools/__tests__/compareTransactions/matcher.test.ts +497 -398
- package/src/tools/__tests__/compareTransactions/parser.test.ts +765 -747
- package/src/tools/__tests__/compareTransactions.test.ts +352 -332
- package/src/tools/__tests__/compareTransactions.window.test.ts +150 -146
- package/src/tools/__tests__/deltaFetcher.scheduled.integration.test.ts +69 -65
- package/src/tools/__tests__/deltaFetcher.test.ts +325 -265
- package/src/tools/__tests__/deltaSupport.test.ts +211 -184
- package/src/tools/__tests__/deltaTestUtils.ts +37 -33
- package/src/tools/__tests__/exportTransactions.test.ts +205 -200
- package/src/tools/__tests__/monthTools.delta.integration.test.ts +68 -68
- package/src/tools/__tests__/monthTools.integration.test.ts +178 -166
- package/src/tools/__tests__/monthTools.test.ts +561 -512
- package/src/tools/__tests__/payeeTools.delta.integration.test.ts +68 -68
- package/src/tools/__tests__/payeeTools.integration.test.ts +158 -142
- package/src/tools/__tests__/payeeTools.test.ts +486 -434
- package/src/tools/__tests__/transactionSchemas.test.ts +1204 -0
- package/src/tools/__tests__/transactionTools.integration.test.ts +875 -825
- package/src/tools/__tests__/transactionTools.test.ts +4923 -4366
- package/src/tools/__tests__/transactionUtils.test.ts +1016 -0
- package/src/tools/__tests__/utilityTools.integration.test.ts +32 -32
- package/src/tools/__tests__/utilityTools.test.ts +68 -58
- package/src/tools/accountTools.ts +293 -271
- package/src/tools/adapters.ts +120 -63
- package/src/tools/budgetTools.ts +121 -116
- package/src/tools/categoryTools.ts +379 -339
- package/src/tools/compareTransactions/formatter.ts +131 -119
- package/src/tools/compareTransactions/index.ts +249 -214
- package/src/tools/compareTransactions/matcher.ts +259 -209
- package/src/tools/compareTransactions/parser.ts +517 -487
- package/src/tools/compareTransactions/types.ts +38 -38
- package/src/tools/compareTransactions.ts +1 -1
- package/src/tools/deltaFetcher.ts +281 -260
- package/src/tools/deltaSupport.ts +264 -259
- package/src/tools/exportTransactions.ts +230 -218
- package/src/tools/monthTools.ts +180 -165
- package/src/tools/payeeTools.ts +152 -140
- package/src/tools/reconcileAdapter.ts +297 -246
- package/src/tools/reconciliation/CLAUDE.md +506 -0
- package/src/tools/reconciliation/__tests__/adapter.causes.test.ts +135 -112
- package/src/tools/reconciliation/__tests__/adapter.test.ts +249 -227
- package/src/tools/reconciliation/__tests__/analyzer.test.ts +408 -335
- package/src/tools/reconciliation/__tests__/csvParser.test.ts +71 -69
- package/src/tools/reconciliation/__tests__/executor.integration.test.ts +348 -323
- package/src/tools/reconciliation/__tests__/executor.progress.test.ts +503 -457
- package/src/tools/reconciliation/__tests__/executor.test.ts +898 -831
- package/src/tools/reconciliation/__tests__/matcher.test.ts +667 -663
- package/src/tools/reconciliation/__tests__/payeeNormalizer.test.ts +296 -276
- package/src/tools/reconciliation/__tests__/recommendationEngine.integration.test.ts +692 -624
- package/src/tools/reconciliation/__tests__/recommendationEngine.test.ts +1008 -986
- package/src/tools/reconciliation/__tests__/reconciliation.delta.integration.test.ts +187 -146
- package/src/tools/reconciliation/__tests__/reportFormatter.test.ts +583 -530
- package/src/tools/reconciliation/__tests__/scenarios/adapterCurrency.scenario.test.ts +75 -71
- package/src/tools/reconciliation/__tests__/scenarios/extremes.scenario.test.ts +70 -58
- package/src/tools/reconciliation/__tests__/scenarios/repeatAmount.scenario.test.ts +102 -88
- package/src/tools/reconciliation/__tests__/schemaUrl.test.ts +58 -43
- package/src/tools/reconciliation/__tests__/signDetector.test.ts +209 -206
- package/src/tools/reconciliation/__tests__/ynabAdapter.test.ts +66 -60
- package/src/tools/reconciliation/analyzer.ts +582 -406
- package/src/tools/reconciliation/csvParser.ts +656 -609
- package/src/tools/reconciliation/executor.ts +1290 -1128
- package/src/tools/reconciliation/index.ts +580 -528
- package/src/tools/reconciliation/matcher.ts +256 -240
- package/src/tools/reconciliation/payeeNormalizer.ts +92 -78
- package/src/tools/reconciliation/recommendationEngine.ts +357 -345
- package/src/tools/reconciliation/reportFormatter.ts +349 -276
- package/src/tools/reconciliation/signDetector.ts +89 -83
- package/src/tools/reconciliation/types.ts +164 -153
- package/src/tools/reconciliation/ynabAdapter.ts +17 -15
- package/src/tools/schemas/CLAUDE.md +546 -0
- package/src/tools/schemas/common.ts +1 -1
- package/src/tools/schemas/outputs/__tests__/accountOutputs.test.ts +410 -409
- package/src/tools/schemas/outputs/__tests__/budgetOutputs.test.ts +305 -299
- package/src/tools/schemas/outputs/__tests__/categoryOutputs.test.ts +431 -430
- package/src/tools/schemas/outputs/__tests__/comparisonOutputs.test.ts +510 -495
- package/src/tools/schemas/outputs/__tests__/dateValidation.test.ts +179 -153
- package/src/tools/schemas/outputs/__tests__/discrepancyDirection.test.ts +293 -254
- package/src/tools/schemas/outputs/__tests__/monthOutputs.test.ts +457 -457
- package/src/tools/schemas/outputs/__tests__/payeeOutputs.test.ts +362 -356
- package/src/tools/schemas/outputs/__tests__/reconciliationOutputs.test.ts +402 -399
- package/src/tools/schemas/outputs/__tests__/transactionMutationSchemas.test.ts +225 -211
- package/src/tools/schemas/outputs/__tests__/transactionOutputs.test.ts +457 -454
- package/src/tools/schemas/outputs/__tests__/utilityOutputs.test.ts +316 -315
- package/src/tools/schemas/outputs/accountOutputs.ts +40 -34
- package/src/tools/schemas/outputs/budgetOutputs.ts +24 -19
- package/src/tools/schemas/outputs/categoryOutputs.ts +76 -56
- package/src/tools/schemas/outputs/comparisonOutputs.ts +192 -169
- package/src/tools/schemas/outputs/index.ts +163 -163
- package/src/tools/schemas/outputs/monthOutputs.ts +95 -80
- package/src/tools/schemas/outputs/payeeOutputs.ts +18 -18
- package/src/tools/schemas/outputs/reconciliationOutputs.ts +386 -373
- package/src/tools/schemas/outputs/transactionMutationOutputs.ts +259 -231
- package/src/tools/schemas/outputs/transactionOutputs.ts +81 -71
- package/src/tools/schemas/outputs/utilityOutputs.ts +90 -84
- package/src/tools/schemas/shared/commonOutputs.ts +27 -19
- package/src/tools/toolCategories.ts +114 -114
- package/src/tools/transactionReadTools.ts +327 -0
- package/src/tools/transactionSchemas.ts +484 -0
- package/src/tools/transactionTools.ts +107 -2990
- package/src/tools/transactionUtils.ts +621 -0
- package/src/tools/transactionWriteTools.ts +2110 -0
- package/src/tools/utilityTools.ts +46 -41
- package/src/types/CLAUDE.md +477 -0
- package/src/types/__tests__/index.test.ts +51 -51
- package/src/types/index.ts +43 -39
- package/src/types/integration-tests.d.ts +26 -26
- package/src/types/reconciliation.ts +29 -29
- package/src/types/toolAnnotations.ts +30 -30
- package/src/types/toolRegistration.ts +43 -32
- package/src/utils/CLAUDE.md +508 -0
- package/src/utils/__tests__/dateUtils.test.ts +174 -168
- package/src/utils/__tests__/money.test.ts +193 -187
- package/src/utils/amountUtils.ts +5 -5
- package/src/utils/baseError.ts +5 -5
- package/src/utils/dateUtils.ts +29 -26
- package/src/utils/errors.ts +14 -14
- package/src/utils/money.ts +66 -52
- package/src/utils/validationError.ts +1 -1
- package/tsconfig.json +29 -29
- package/tsconfig.prod.json +16 -16
- package/vitest-reporters/split-json-reporter.ts +247 -204
- package/vitest.config.ts +99 -95
- package/.prettierignore +0 -10
- package/.prettierrc.json +0 -10
- package/eslint.config.js +0 -49
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
# Reconciliation System - YNAB MCP Server
|
|
2
|
+
|
|
3
|
+
This directory contains the comprehensive account reconciliation system for matching bank CSV transactions with YNAB transactions using fuzzy matching, bulk operations, and smart recommendations.
|
|
4
|
+
|
|
5
|
+
## Purpose & Responsibilities
|
|
6
|
+
|
|
7
|
+
The `src/tools/reconciliation/` directory implements:
|
|
8
|
+
|
|
9
|
+
1. **CSV Parsing** - Parse bank CSV files with presets for major Canadian banks
|
|
10
|
+
2. **Fuzzy Matching** - Match transactions despite merchant name variations
|
|
11
|
+
3. **Transaction Analysis** - Detect discrepancies, duplicates, and missing transactions
|
|
12
|
+
4. **Bulk Operations** - Create, update, and unclear transactions in bulk with progress tracking
|
|
13
|
+
5. **Recommendations** - Smart suggestions for reconciliation actions
|
|
14
|
+
6. **Date Range Filtering** (v0.18.4) - Filter YNAB transactions to statement period to prevent false positives
|
|
15
|
+
|
|
16
|
+
## Architecture
|
|
17
|
+
|
|
18
|
+
The reconciliation system follows a pipeline architecture:
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
CSV File → Parser → Matcher → Analyzer → Executor → Reporter
|
|
22
|
+
↓ ↓ ↓ ↓
|
|
23
|
+
Presets Fuzzy Logic Rules Bulk API
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Component Flow
|
|
27
|
+
|
|
28
|
+
1. **CSV Parser** - Parse bank CSV, auto-detect sign convention, normalize payees
|
|
29
|
+
2. **Matcher** - Fuzzy match CSV transactions to YNAB transactions (85% threshold)
|
|
30
|
+
3. **Analyzer** - Analyze matches, detect discrepancies, duplicates, missing transactions
|
|
31
|
+
4. **Executor** - Execute bulk create/update/unclear operations with progress tracking
|
|
32
|
+
5. **Reporter** - Format human-readable reconciliation report with statistics
|
|
33
|
+
|
|
34
|
+
## Key Files & Responsibilities
|
|
35
|
+
|
|
36
|
+
| File | Responsibility | Lines | Critical |
|
|
37
|
+
|------|---------------|-------|----------|
|
|
38
|
+
| **csvParser.ts** | CSV parsing with bank presets (TD, RBC, Scotiabank, etc.) | ~400 | HIGH |
|
|
39
|
+
| **matcher.ts** | Fuzzy matching engine with configurable scoring | ~500 | CRITICAL |
|
|
40
|
+
| **analyzer.ts** | Transaction analysis and discrepancy detection | ~600 | CRITICAL |
|
|
41
|
+
| **executor.ts** | Bulk transaction operations (create/update/unclear) | ~700 | HIGH |
|
|
42
|
+
| **recommendationEngine.ts** | Smart reconciliation recommendations | ~300 | MEDIUM |
|
|
43
|
+
| **reportFormatter.ts** | Human-readable reconciliation reports | ~400 | MEDIUM |
|
|
44
|
+
| **signDetector.ts** | Auto-detection of debit/credit sign conventions | ~200 | HIGH |
|
|
45
|
+
| **payeeNormalizer.ts** | Payee name normalization for matching | ~150 | MEDIUM |
|
|
46
|
+
| **ynabAdapter.ts** | YNAB API integration layer | ~300 | HIGH |
|
|
47
|
+
|
|
48
|
+
## Critical Patterns & Conventions
|
|
49
|
+
|
|
50
|
+
### 1. Date Range Filtering (v0.18.4)
|
|
51
|
+
|
|
52
|
+
**Critical Change**: Reconciliation now filters YNAB transactions to only those within the statement date range.
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
// Extract date range from CSV transactions
|
|
56
|
+
const csvDates = csvTransactions.map((t) => new Date(t.date).getTime());
|
|
57
|
+
const minDate = new Date(Math.min(...csvDates));
|
|
58
|
+
const maxDate = new Date(Math.max(...csvDates));
|
|
59
|
+
|
|
60
|
+
// Filter YNAB transactions to date range using Date.UTC for timezone safety
|
|
61
|
+
const inRangeTransactions = ynabTransactions.filter((t) => {
|
|
62
|
+
const txDate = new Date(t.date);
|
|
63
|
+
const txTime = Date.UTC(
|
|
64
|
+
txDate.getFullYear(),
|
|
65
|
+
txDate.getMonth(),
|
|
66
|
+
txDate.getDate()
|
|
67
|
+
);
|
|
68
|
+
const minTime = Date.UTC(
|
|
69
|
+
minDate.getFullYear(),
|
|
70
|
+
minDate.getMonth(),
|
|
71
|
+
minDate.getDate()
|
|
72
|
+
);
|
|
73
|
+
const maxTime = Date.UTC(
|
|
74
|
+
maxDate.getFullYear(),
|
|
75
|
+
maxDate.getMonth(),
|
|
76
|
+
maxDate.getDate()
|
|
77
|
+
);
|
|
78
|
+
return txTime >= minTime && txTime <= maxTime;
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Why Critical**: Prevents false "missing from bank" matches for transactions outside the statement period.
|
|
83
|
+
|
|
84
|
+
**What Breaks**: Not using `Date.UTC()` → timezone bugs. Not filtering → false positives for transactions before/after statement period.
|
|
85
|
+
|
|
86
|
+
### 2. Matching Algorithm
|
|
87
|
+
|
|
88
|
+
The matcher uses weighted scoring with configurable thresholds:
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
interface MatchScoring {
|
|
92
|
+
amountWeight: 0.5; // 50% weight on amount match
|
|
93
|
+
payeeWeight: 0.35; // 35% weight on payee match
|
|
94
|
+
dateWeight: 0.15; // 15% weight on date match
|
|
95
|
+
amountTolerance: 10; // 1 cent (10 milliunits)
|
|
96
|
+
dateTolerance: 7; // 7 days
|
|
97
|
+
autoMatchThreshold: 85; // 85% score for auto-match
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**Matching Logic**:
|
|
102
|
+
|
|
103
|
+
1. **Amount Score**: 100% if within tolerance (1 cent), 0% otherwise
|
|
104
|
+
2. **Payee Score**: Fuzzy token-set-ratio (handles merchant name variations)
|
|
105
|
+
3. **Date Score**: 100% if exact match, linear decay over 7 days
|
|
106
|
+
4. **Total Score**: Weighted average of above
|
|
107
|
+
5. **Auto-Match**: Score ≥85% automatically matches
|
|
108
|
+
|
|
109
|
+
**Why Critical**: Balance between precision (no false matches) and recall (catch all matches).
|
|
110
|
+
|
|
111
|
+
**What Breaks**: Too low threshold → false matches. Too high threshold → missed matches. Wrong weights → poor matching accuracy.
|
|
112
|
+
|
|
113
|
+
### 3. Bulk Operations with Progress
|
|
114
|
+
|
|
115
|
+
All bulk operations (create, update, unclear) are chunked with progress tracking:
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
async function bulkCreateTransactions(
|
|
119
|
+
transactions: Transaction[],
|
|
120
|
+
sendProgress?: ProgressCallback
|
|
121
|
+
): Promise<BulkResult> {
|
|
122
|
+
const chunks = chunkArray(transactions, 100); // Max 100 per API request
|
|
123
|
+
let completed = 0;
|
|
124
|
+
|
|
125
|
+
for (const chunk of chunks) {
|
|
126
|
+
await sendProgress?.({
|
|
127
|
+
progress: completed,
|
|
128
|
+
total: transactions.length,
|
|
129
|
+
message: `Creating transactions ${completed + 1}-${completed + chunk.length}...`,
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
await ynabAPI.createTransactions(chunk);
|
|
133
|
+
completed += chunk.length;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return { created: completed };
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
**Why Critical**: YNAB API limits requests to 100 transactions. Progress prevents timeouts for large reconciliations.
|
|
141
|
+
|
|
142
|
+
**What Breaks**: >100 transactions per request → API rejection. Missing progress → timeouts. Missing optional chaining (`?.`) → TypeError.
|
|
143
|
+
|
|
144
|
+
### 4. CSV Bank Presets
|
|
145
|
+
|
|
146
|
+
The CSV parser includes presets for major Canadian banks:
|
|
147
|
+
|
|
148
|
+
```typescript
|
|
149
|
+
const BANK_PRESETS = {
|
|
150
|
+
TD: {
|
|
151
|
+
dateColumn: 'Date',
|
|
152
|
+
amountColumn: 'Amount',
|
|
153
|
+
payeeColumn: 'Description',
|
|
154
|
+
signConvention: 'negative_debit', // Debits are negative
|
|
155
|
+
},
|
|
156
|
+
RBC: {
|
|
157
|
+
dateColumn: 'Transaction Date',
|
|
158
|
+
amountColumn: 'Amount',
|
|
159
|
+
payeeColumn: 'Description',
|
|
160
|
+
signConvention: 'positive_debit', // Debits are positive
|
|
161
|
+
},
|
|
162
|
+
SCOTIABANK: {
|
|
163
|
+
dateColumn: 'Date',
|
|
164
|
+
amountColumn: 'Amount',
|
|
165
|
+
payeeColumn: 'Description',
|
|
166
|
+
signConvention: 'auto', // Auto-detect
|
|
167
|
+
},
|
|
168
|
+
// ... more presets
|
|
169
|
+
};
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
**Why Important**: Simplifies CSV parsing for common banks. Auto-detection handles edge cases.
|
|
173
|
+
|
|
174
|
+
**What Breaks**: Wrong preset → incorrect parsing. Missing preset → manual column mapping required.
|
|
175
|
+
|
|
176
|
+
### 5. Sign Convention Detection
|
|
177
|
+
|
|
178
|
+
The sign detector auto-detects whether debits are positive or negative in the CSV:
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
function detectSignConvention(transactions: CSVTransaction[]): SignConvention {
|
|
182
|
+
const positiveCount = transactions.filter((t) => t.amount > 0).length;
|
|
183
|
+
const negativeCount = transactions.filter((t) => t.amount < 0).length;
|
|
184
|
+
|
|
185
|
+
// If mostly positive, debits are likely positive (e.g., RBC)
|
|
186
|
+
if (positiveCount > negativeCount * 2) {
|
|
187
|
+
return 'positive_debit';
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// If mostly negative, debits are likely negative (e.g., TD)
|
|
191
|
+
if (negativeCount > positiveCount * 2) {
|
|
192
|
+
return 'negative_debit';
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Mixed, use heuristics (e.g., check for "debit" in description)
|
|
196
|
+
return detectFromDescriptions(transactions);
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
**Why Important**: Different banks use different sign conventions. Auto-detection handles both.
|
|
201
|
+
|
|
202
|
+
**What Breaks**: Wrong detection → all amounts inverted (debits become credits).
|
|
203
|
+
|
|
204
|
+
### 6. Payee Normalization
|
|
205
|
+
|
|
206
|
+
Payee names are normalized for better matching:
|
|
207
|
+
|
|
208
|
+
```typescript
|
|
209
|
+
function normalizePayee(payee: string): string {
|
|
210
|
+
return (
|
|
211
|
+
payee
|
|
212
|
+
.toLowerCase()
|
|
213
|
+
.replace(/[^a-z0-9\s]/g, '') // Remove special chars
|
|
214
|
+
.replace(/\s+/g, ' ') // Collapse whitespace
|
|
215
|
+
.trim()
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Example:
|
|
220
|
+
// "AMAZON.CA*2X3Y4Z" → "amazonca2x3y4z"
|
|
221
|
+
// "Tim Hortons #1234" → "tim hortons 1234"
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
**Why Important**: Merchant names vary (location codes, punctuation). Normalization improves fuzzy matching.
|
|
225
|
+
|
|
226
|
+
**What Breaks**: Over-normalization → lost information. Under-normalization → missed matches.
|
|
227
|
+
|
|
228
|
+
## Configuration
|
|
229
|
+
|
|
230
|
+
Default configuration values:
|
|
231
|
+
|
|
232
|
+
```typescript
|
|
233
|
+
const DEFAULT_CONFIG = {
|
|
234
|
+
amountTolerance: 10, // 1 cent (10 milliunits)
|
|
235
|
+
dateTolerance: 7, // 7 days (accommodates bank posting delays)
|
|
236
|
+
amountWeight: 0.5, // 50% weight
|
|
237
|
+
payeeWeight: 0.35, // 35% weight
|
|
238
|
+
dateWeight: 0.15, // 15% weight
|
|
239
|
+
autoMatchThreshold: 85, // 85% score
|
|
240
|
+
maxBulkSize: 100, // Max transactions per API request
|
|
241
|
+
};
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
## Common Development Tasks
|
|
245
|
+
|
|
246
|
+
### Adding a New Bank Preset
|
|
247
|
+
|
|
248
|
+
1. **Identify CSV format** - Download sample CSV, identify column names
|
|
249
|
+
2. **Determine sign convention** - Are debits positive or negative?
|
|
250
|
+
3. **Add preset** in `csvParser.ts`:
|
|
251
|
+
```typescript
|
|
252
|
+
const BANK_PRESETS = {
|
|
253
|
+
MY_BANK: {
|
|
254
|
+
dateColumn: 'Date',
|
|
255
|
+
amountColumn: 'Amount',
|
|
256
|
+
payeeColumn: 'Description',
|
|
257
|
+
signConvention: 'auto', // or 'positive_debit' / 'negative_debit'
|
|
258
|
+
},
|
|
259
|
+
};
|
|
260
|
+
```
|
|
261
|
+
4. **Test with real CSV** - Verify parsing and sign detection
|
|
262
|
+
|
|
263
|
+
### Adjusting Matching Thresholds
|
|
264
|
+
|
|
265
|
+
To adjust matching sensitivity:
|
|
266
|
+
|
|
267
|
+
1. **Update scoring weights** in `matcher.ts`:
|
|
268
|
+
```typescript
|
|
269
|
+
const SCORING = {
|
|
270
|
+
amountWeight: 0.6, // Increase amount importance
|
|
271
|
+
payeeWeight: 0.3, // Decrease payee importance
|
|
272
|
+
dateWeight: 0.1,
|
|
273
|
+
};
|
|
274
|
+
```
|
|
275
|
+
2. **Update auto-match threshold**:
|
|
276
|
+
```typescript
|
|
277
|
+
const AUTO_MATCH_THRESHOLD = 90; // Higher = more conservative
|
|
278
|
+
```
|
|
279
|
+
3. **Test with real data** - Verify match quality
|
|
280
|
+
|
|
281
|
+
### Adding Progress Notifications
|
|
282
|
+
|
|
283
|
+
Progress is already implemented for bulk operations. To add to new operations:
|
|
284
|
+
|
|
285
|
+
1. **Accept `sendProgress` callback**:
|
|
286
|
+
```typescript
|
|
287
|
+
async function myOperation(
|
|
288
|
+
input: Input,
|
|
289
|
+
sendProgress?: ProgressCallback
|
|
290
|
+
): Promise<Output>
|
|
291
|
+
```
|
|
292
|
+
2. **Emit progress updates**:
|
|
293
|
+
```typescript
|
|
294
|
+
await sendProgress?.({
|
|
295
|
+
progress: currentStep,
|
|
296
|
+
total: totalSteps,
|
|
297
|
+
message: 'Processing...',
|
|
298
|
+
});
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
## Testing Approach
|
|
302
|
+
|
|
303
|
+
### Unit Tests
|
|
304
|
+
|
|
305
|
+
- **Location**: `src/tools/reconciliation/__tests__/*.test.ts`
|
|
306
|
+
- **Mock**: YNAB API, file system
|
|
307
|
+
- **Coverage**: 80% minimum
|
|
308
|
+
- **Focus**: Matching logic, sign detection, payee normalization
|
|
309
|
+
|
|
310
|
+
### Integration Tests
|
|
311
|
+
|
|
312
|
+
- **Location**: `src/tools/reconciliation/__tests__/*.integration.test.ts`
|
|
313
|
+
- **Mock**: YNAB API (realistic fixtures)
|
|
314
|
+
- **Real**: CSV parsing, matching, analysis
|
|
315
|
+
- **Focus**: End-to-end reconciliation flow
|
|
316
|
+
|
|
317
|
+
### Example Unit Test
|
|
318
|
+
|
|
319
|
+
```typescript
|
|
320
|
+
describe('matcher', () => {
|
|
321
|
+
it('should match transactions with 85%+ score', () => {
|
|
322
|
+
const csvTx = {
|
|
323
|
+
date: '2025-01-31',
|
|
324
|
+
amount: 25500, // milliunits
|
|
325
|
+
payee: 'AMAZON.CA*2X3Y4Z',
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
const ynabTx = {
|
|
329
|
+
date: '2025-01-31',
|
|
330
|
+
amount: 25500,
|
|
331
|
+
payee_name: 'Amazon',
|
|
332
|
+
};
|
|
333
|
+
|
|
334
|
+
const score = calculateMatchScore(csvTx, ynabTx);
|
|
335
|
+
expect(score).toBeGreaterThan(85);
|
|
336
|
+
});
|
|
337
|
+
});
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
## What Will Break If Violated
|
|
341
|
+
|
|
342
|
+
### 1. Missing Date Range Filtering (v0.18.4)
|
|
343
|
+
|
|
344
|
+
**Problem**: Not filtering YNAB transactions to statement date range.
|
|
345
|
+
|
|
346
|
+
**Impact**: False "missing from bank" matches for transactions outside statement period.
|
|
347
|
+
|
|
348
|
+
**Fix**: Always filter YNAB transactions to CSV date range:
|
|
349
|
+
|
|
350
|
+
```typescript
|
|
351
|
+
const inRangeTransactions = filterToDateRange(
|
|
352
|
+
ynabTransactions,
|
|
353
|
+
csvMinDate,
|
|
354
|
+
csvMaxDate
|
|
355
|
+
);
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
### 2. Not Using `Date.UTC()` for Date Comparison
|
|
359
|
+
|
|
360
|
+
**Problem**: Using local time for date comparisons.
|
|
361
|
+
|
|
362
|
+
**Impact**: Timezone bugs → transactions on boundary dates incorrectly included/excluded.
|
|
363
|
+
|
|
364
|
+
**Fix**: Always use `Date.UTC()` for date comparisons:
|
|
365
|
+
|
|
366
|
+
```typescript
|
|
367
|
+
// BAD
|
|
368
|
+
const txTime = new Date(txDate).getTime();
|
|
369
|
+
|
|
370
|
+
// GOOD
|
|
371
|
+
const txTime = Date.UTC(
|
|
372
|
+
txDate.getFullYear(),
|
|
373
|
+
txDate.getMonth(),
|
|
374
|
+
txDate.getDate()
|
|
375
|
+
);
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
### 3. Missing Milliunits Conversion
|
|
379
|
+
|
|
380
|
+
**Problem**: Comparing dollar amounts to YNAB milliunits.
|
|
381
|
+
|
|
382
|
+
**Impact**: No matches (amounts off by 1000x).
|
|
383
|
+
|
|
384
|
+
**Fix**: Always convert CSV amounts to milliunits:
|
|
385
|
+
|
|
386
|
+
```typescript
|
|
387
|
+
const csvAmountMilliunits = amountToMilliunits(csvRow.amount);
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
### 4. >100 Transactions Per Bulk Request
|
|
391
|
+
|
|
392
|
+
**Problem**: Sending >100 transactions in a single API request.
|
|
393
|
+
|
|
394
|
+
**Impact**: YNAB API rejection (400 error).
|
|
395
|
+
|
|
396
|
+
**Fix**: Always chunk bulk operations:
|
|
397
|
+
|
|
398
|
+
```typescript
|
|
399
|
+
const chunks = chunkArray(transactions, 100);
|
|
400
|
+
for (const chunk of chunks) {
|
|
401
|
+
await ynabAPI.createTransactions(chunk);
|
|
402
|
+
}
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
### 5. Missing Progress for Long Operations
|
|
406
|
+
|
|
407
|
+
**Problem**: Not emitting progress for operations >5 seconds.
|
|
408
|
+
|
|
409
|
+
**Impact**: Timeouts, poor UX, no visibility into reconciliation status.
|
|
410
|
+
|
|
411
|
+
**Fix**: Emit progress updates during bulk operations:
|
|
412
|
+
|
|
413
|
+
```typescript
|
|
414
|
+
await sendProgress?.({
|
|
415
|
+
progress: completed,
|
|
416
|
+
total: totalTransactions,
|
|
417
|
+
message: 'Creating transactions...',
|
|
418
|
+
});
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
### 6. Wrong Sign Convention
|
|
422
|
+
|
|
423
|
+
**Problem**: Not detecting or using wrong sign convention.
|
|
424
|
+
|
|
425
|
+
**Impact**: All amounts inverted (debits become credits, credits become debits).
|
|
426
|
+
|
|
427
|
+
**Fix**: Use auto-detection or correct preset:
|
|
428
|
+
|
|
429
|
+
```typescript
|
|
430
|
+
const signConvention = detectSignConvention(csvTransactions);
|
|
431
|
+
const correctedAmounts = applySignConvention(
|
|
432
|
+
csvTransactions,
|
|
433
|
+
signConvention
|
|
434
|
+
);
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
## Reconciliation Report Fields (v0.18.4)
|
|
438
|
+
|
|
439
|
+
The reconciliation report includes the following statistics:
|
|
440
|
+
|
|
441
|
+
```typescript
|
|
442
|
+
interface ReconciliationReport {
|
|
443
|
+
// Summary statistics
|
|
444
|
+
total_csv_transactions: number;
|
|
445
|
+
total_ynab_transactions: number;
|
|
446
|
+
ynab_in_range_count: number; // NEW (v0.18.4)
|
|
447
|
+
ynab_outside_range_count: number; // NEW (v0.18.4)
|
|
448
|
+
|
|
449
|
+
// Match statistics
|
|
450
|
+
matched_count: number;
|
|
451
|
+
auto_matched_count: number;
|
|
452
|
+
manual_review_count: number;
|
|
453
|
+
|
|
454
|
+
// Discrepancy statistics
|
|
455
|
+
discrepancies_count: number;
|
|
456
|
+
missing_from_bank_count: number;
|
|
457
|
+
missing_from_ynab_count: number;
|
|
458
|
+
duplicates_count: number;
|
|
459
|
+
|
|
460
|
+
// Bulk operation results
|
|
461
|
+
created_count: number;
|
|
462
|
+
updated_count: number;
|
|
463
|
+
uncleared_count: number;
|
|
464
|
+
failed_count: number;
|
|
465
|
+
errors: BulkError[];
|
|
466
|
+
}
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
### New Fields (v0.18.4)
|
|
470
|
+
|
|
471
|
+
- **`ynab_in_range_count`**: Number of YNAB transactions within statement date range (eligible for matching)
|
|
472
|
+
- **`ynab_outside_range_count`**: Number of YNAB transactions outside statement date range (excluded from matching)
|
|
473
|
+
|
|
474
|
+
These fields help users understand why certain YNAB transactions weren't matched (they were outside the statement period).
|
|
475
|
+
|
|
476
|
+
## Performance Considerations
|
|
477
|
+
|
|
478
|
+
1. **Chunked Bulk Operations**: Max 100 transactions per API request
|
|
479
|
+
2. **Progress Notifications**: Every chunk (100 transactions) emits progress
|
|
480
|
+
3. **Date Range Filtering**: Reduces YNAB transaction set for faster matching
|
|
481
|
+
4. **Fuzzy Matching**: Uses optimized token-set-ratio algorithm
|
|
482
|
+
5. **Payee Normalization**: Caches normalized payees to avoid re-computation
|
|
483
|
+
|
|
484
|
+
## Integration Points
|
|
485
|
+
|
|
486
|
+
### With Tools (`src/tools/`)
|
|
487
|
+
|
|
488
|
+
- **reconcileAdapter.ts**: Legacy adapter for reconciliation tool
|
|
489
|
+
- **transactionTools.ts**: Uses bulk transaction creation/update
|
|
490
|
+
|
|
491
|
+
### With Server (`src/server/`)
|
|
492
|
+
|
|
493
|
+
- **toolRegistry.ts**: Progress notification support
|
|
494
|
+
- **cacheManager.ts**: Cache invalidation after bulk operations
|
|
495
|
+
|
|
496
|
+
### With Utils (`src/utils/`)
|
|
497
|
+
|
|
498
|
+
- **money.ts**: Milliunits conversion for amount matching
|
|
499
|
+
- **dateUtils.ts**: Date formatting and validation
|
|
500
|
+
|
|
501
|
+
## Related Documentation
|
|
502
|
+
|
|
503
|
+
- [Root CLAUDE.md](../../../CLAUDE.md) - Project overview
|
|
504
|
+
- [Tools CLAUDE.md](../CLAUDE.md) - Tool implementation patterns
|
|
505
|
+
- [Server CLAUDE.md](../../server/CLAUDE.md) - Server components
|
|
506
|
+
- [Reconciliation Architecture](../../../docs/technical/reconciliation-system-architecture.md) - Detailed system design
|