@dizzlkheinz/ynab-mcpb 0.12.1

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 (435) hide show
  1. package/.chunkhound.json +11 -0
  2. package/.code/agents/0427d95e-edca-431f-a214-5e53264e29c4/error.txt +8 -0
  3. package/.code/agents/0d675174-d1e1-41c3-9975-4c2e275819a9/error.txt +3 -0
  4. package/.code/agents/0d8c5afd-4787-422b-abf8-2e5943fc7e67/error.txt +3 -0
  5. package/.code/agents/0ec34a70-ed5d-4b9e-bee4-bb0e4cccbc4b/error.txt +1 -0
  6. package/.code/agents/0ef51a21-1ab1-49d7-9561-0eaa43875ebc/error.txt +12 -0
  7. package/.code/agents/15db95d7-abad-4b4d-9c3b-8446089cb61d/error.txt +1 -0
  8. package/.code/agents/19ab9acb-f675-4ff0-902a-09a5476f8149/error.txt +1 -0
  9. package/.code/agents/1ef7e12d-f6ff-4897-8a9b-152d523d898e/error.txt +5 -0
  10. package/.code/agents/2465/exec-call_lroN9KKzJVWC7t5423DK1nT9.txt +1453 -0
  11. package/.code/agents/28edb6fe-95a9-41a0-ae69-aa0100d26c0c/error.txt +8 -0
  12. package/.code/agents/2ae40cf5-b4bf-42e2-92bf-7ea350a7755e/error.txt +9 -0
  13. package/.code/agents/2bfc4e1f-ac4b-45a5-b6df-bf89d4dbb54c/error.txt +1 -0
  14. package/.code/agents/2e2e1134-eff0-49be-ba25-8e2c3468a564/error.txt +5 -0
  15. package/.code/agents/3/exec-call_203OC4TNVkLxW7z2HCVEQ1cM.txt +81 -0
  16. package/.code/agents/3/exec-call_SS5T0XSiXB4LSNzUKTl75wkh.txt +610 -0
  17. package/.code/agents/3322c003-ce5e-48e3-a342-f5049c5bf9a2/error.txt +1 -0
  18. package/.code/agents/391e9b08-1ebc-468c-9bcd-6d0cc3193b37/error.txt +1 -0
  19. package/.code/agents/3ab0aa84-b7bb-4054-afa3-40b8fd7d3be0/error.txt +1 -0
  20. package/.code/agents/3bed368d-50fe-477e-aee3-a6707eaa1ab9/error.txt +3 -0
  21. package/.code/agents/3e40b925-db12-442f-8d7a-a25fc69a6672/error.txt +8 -0
  22. package/.code/agents/414d5776-cf58-41f3-9328-a6daed503a50/error.txt +5 -0
  23. package/.code/agents/42687751-4565-4610-b240-67835b17d861/error.txt +1 -0
  24. package/.code/agents/46b98876-1a39-43c9-9e2f-507ca6d47335/error.txt +9 -0
  25. package/.code/agents/4a7d9491-b26f-43dd-850d-2ecdc49b5d1b/error.txt +1 -0
  26. package/.code/agents/4e60f00a-1b3e-447f-87f3-7faf9deddec3/error.txt +13 -0
  27. package/.code/agents/5138fc1c-4d49-4b74-a7da-ccdb3a8e44e7/error.txt +14 -0
  28. package/.code/agents/521cff39-a7a3-42e5-a557-134f0f7daaa0/error.txt +5 -0
  29. package/.code/agents/53302dc5-3857-4413-9a47-9e0f64a51dc4/error.txt +5 -0
  30. package/.code/agents/567c7c2e-6a6f-4761-a08d-d36deeb2e0ac/error.txt +5 -0
  31. package/.code/agents/57b00845-80dc-47c9-953c-3028d16275d6/error.txt +3 -0
  32. package/.code/agents/593d9005-c2a5-48fd-8813-ece0d3f2de96/error.txt +1 -0
  33. package/.code/agents/5a112e66-0e1a-42f9-877c-53af56ea3551/error.txt +1 -0
  34. package/.code/agents/5b05e8ed-7788-4738-b7ee-9faa8180f992/error.txt +5 -0
  35. package/.code/agents/5f888d6f-d7ca-4ac8-be23-9ea1bf753951/error.txt +5 -0
  36. package/.code/agents/607db3ab-e4b0-435b-b497-93e9aa525549/error.txt +8 -0
  37. package/.code/agents/67dcb2a2-900f-4c78-b3fc-80b5213e0ddf/error.txt +8 -0
  38. package/.code/agents/69ad848c-4e98-49b3-b16c-0094ac2d1759/error.txt +5 -0
  39. package/.code/agents/6c9cfc5f-0d0b-445c-b121-9f60082c4f70/error.txt +1 -0
  40. package/.code/agents/6f6f8f77-4ab0-4f6e-9f30-40e8be0bd8f5/error.txt +1 -0
  41. package/.code/agents/72a7cde4-fa8a-4024-9038-27faa550539b/error.txt +1 -0
  42. package/.code/agents/7b48335c-8247-43aa-9949-5f820ba8e199/error.txt +1 -0
  43. package/.code/agents/80944249-bea9-4ac5-87de-a666c4df306e/error.txt +1 -0
  44. package/.code/agents/826099df-1b66-4186-a915-7eb59f9db19d/error.txt +5 -0
  45. package/.code/agents/8291d158-18a8-4a92-b799-4e9a4d9cce88/error.txt +1 -0
  46. package/.code/agents/82fb71a3-20fb-4341-804a-a2fc900f95bc/error.txt +1 -0
  47. package/.code/agents/855790ea-54ee-43e4-8209-a66994e37590/error.txt +1 -0
  48. package/.code/agents/88ce3a2e-04f2-42be-9062-bf97aa798da0/error.txt +3 -0
  49. package/.code/agents/9a17e398-b6ed-4218-bb55-bc64a8d38ce8/error.txt +8 -0
  50. package/.code/agents/9a4f4bfc-a2a6-4f40-a896-9335b41a7ed1/error.txt +1 -0
  51. package/.code/agents/9b633e55-ef84-47d6-94bb-fd3dd172ad97/error.txt +1 -0
  52. package/.code/agents/9b81f3ab-c72b-4a81-9a8f-28a49ddba84a/error.txt +8 -0
  53. package/.code/agents/a35daf29-b2d1-4aef-9b42-dad63a76bd47/error.txt +3 -0
  54. package/.code/agents/a81990cc-69ee-44d2-b907-17403c9bc5d7/error.txt +5 -0
  55. package/.code/agents/ab56260a-4a83-4ad4-9410-f88a23d6520a/error.txt +1 -0
  56. package/.code/agents/ad722c31-2d1d-45f7-bae2-3f02ca455b60/error.txt +1 -0
  57. package/.code/agents/b62e8690-3324-4b97-9309-731bee79416b/error.txt +5 -0
  58. package/.code/agents/baf60a3a-752b-4ad8-99d6-df32423ed2eb/error.txt +1 -0
  59. package/.code/agents/be049042-7dcb-4ac8-9beb-c8f1aea67742/error.txt +14 -0
  60. package/.code/agents/bed1dcb4-bfce-4a9f-8594-0f994962aafd/error.txt +1 -0
  61. package/.code/agents/c324a6cf-e935-4ede-9529-b3ebc18e8d6b/error.txt +5 -0
  62. package/.code/agents/c37c06ff-dfe3-43f2-9bbc-3ec73ec8f41d/error.txt +5 -0
  63. package/.code/agents/c8cd6671-433a-456b-9f88-e51cb2df6bfc/error.txt +11 -0
  64. package/.code/agents/ca2ccb67-2f24-428e-b27d-9365beadd140/error.txt +1 -0
  65. package/.code/agents/cf08c0c8-e7f0-423e-93ba-547e8e818340/error.txt +8 -0
  66. package/.code/agents/d579c74f-874b-40a4-9d56-ced1eb6a701d/error.txt +1 -0
  67. package/.code/agents/df412c98-7378-4deb-8e1e-76c416931181/error.txt +3 -0
  68. package/.code/agents/e5134eb3-2af4-45b0-8998-051cb4afdb45/error.txt +3 -0
  69. package/.code/agents/e6308471-aa45-4e9e-9496-2e9404164d97/error.txt +8 -0
  70. package/.code/agents/e7bd8bc7-23fb-4f46-98dc-b0dcf11b75a1/error.txt +1 -0
  71. package/.code/agents/e92bec35-378d-4fe1-8ac0-6e1bb3c86911/error.txt +5 -0
  72. package/.code/agents/ed918fbf-2dc4-4aa2-bfc5-04b65d9471ea/error.txt +1 -0
  73. package/.code/agents/ef1d756f-b272-48fc-8729-f05c494674f7/error.txt +1 -0
  74. package/.code/agents/ef359853-0249-4e41-a804-c0fc459fe456/error.txt +1 -0
  75. package/.code/agents/effc7b4a-4b90-40a0-8c86-a7a99d2d5fd2/error.txt +1 -0
  76. package/.code/agents/fa15f8d5-8359-4a8b-83a3-2f2056b3ff40/error.txt +3 -0
  77. package/.code/agents/fbef4193-eadf-4c8a-83ff-4878a6310f25/error.txt +8 -0
  78. package/.code/agents/fd0a4b4a-fda4-4964-a6d6-2b8a2da387c6/error.txt +1 -0
  79. package/.dxtignore +57 -0
  80. package/.env.example +44 -0
  81. package/.gemini/settings.json +8 -0
  82. package/.github/ISSUE_TEMPLATE/bug_report.md +41 -0
  83. package/.github/ISSUE_TEMPLATE/config.yml +5 -0
  84. package/.github/ISSUE_TEMPLATE/feature_request.md +24 -0
  85. package/.github/ISSUE_TEMPLATE/release_checklist.md +31 -0
  86. package/.github/pull_request_template.md +41 -0
  87. package/.github/workflows/ci-tests.yml +41 -0
  88. package/.github/workflows/claude-code-review.yml +57 -0
  89. package/.github/workflows/claude.yml +50 -0
  90. package/.github/workflows/full-integration.yml +22 -0
  91. package/.github/workflows/pr-description-check.yml +88 -0
  92. package/.github/workflows/publish.yml +33 -0
  93. package/.github/workflows/release.yml +89 -0
  94. package/.mcpbignore +58 -0
  95. package/.prettierignore +10 -0
  96. package/.prettierrc.json +10 -0
  97. package/ADOS-2-Module-1-Complete-Manual.md +757 -0
  98. package/AGENTS.md +36 -0
  99. package/CHANGELOG.md +187 -0
  100. package/CLAUDE.md +414 -0
  101. package/CODEREVIEW_RESPONSE.md +128 -0
  102. package/LICENSE +17 -0
  103. package/NUL +1 -0
  104. package/README.md +222 -0
  105. package/SCHEMA_IMPROVEMENT_SUMMARY.md +120 -0
  106. package/TESTING_NOTES.md +217 -0
  107. package/WARP.md +245 -0
  108. package/accountactivity-merged.csv +149 -0
  109. package/bin/ynab-mcp-server.cjs +4 -0
  110. package/bin/ynab-mcp-server.js +8 -0
  111. package/bundle-analysis.html +13110 -0
  112. package/dist/bundle/index.cjs +124 -0
  113. package/dist/index.d.ts +2 -0
  114. package/dist/index.js +85 -0
  115. package/dist/server/YNABMCPServer.d.ts +264 -0
  116. package/dist/server/YNABMCPServer.js +845 -0
  117. package/dist/server/budgetResolver.d.ts +15 -0
  118. package/dist/server/budgetResolver.js +99 -0
  119. package/dist/server/cacheManager.d.ts +74 -0
  120. package/dist/server/cacheManager.js +306 -0
  121. package/dist/server/config.d.ts +3 -0
  122. package/dist/server/config.js +19 -0
  123. package/dist/server/deltaCache.d.ts +61 -0
  124. package/dist/server/deltaCache.js +206 -0
  125. package/dist/server/deltaCache.merge.d.ts +9 -0
  126. package/dist/server/deltaCache.merge.js +111 -0
  127. package/dist/server/diagnostics.d.ts +90 -0
  128. package/dist/server/diagnostics.js +163 -0
  129. package/dist/server/errorHandler.d.ts +69 -0
  130. package/dist/server/errorHandler.js +524 -0
  131. package/dist/server/prompts.d.ts +31 -0
  132. package/dist/server/prompts.js +205 -0
  133. package/dist/server/rateLimiter.d.ts +27 -0
  134. package/dist/server/rateLimiter.js +82 -0
  135. package/dist/server/requestLogger.d.ts +62 -0
  136. package/dist/server/requestLogger.js +190 -0
  137. package/dist/server/resources.d.ts +39 -0
  138. package/dist/server/resources.js +85 -0
  139. package/dist/server/responseFormatter.d.ts +14 -0
  140. package/dist/server/responseFormatter.js +42 -0
  141. package/dist/server/securityMiddleware.d.ts +87 -0
  142. package/dist/server/securityMiddleware.js +117 -0
  143. package/dist/server/serverKnowledgeStore.d.ts +11 -0
  144. package/dist/server/serverKnowledgeStore.js +42 -0
  145. package/dist/server/toolRegistry.d.ts +85 -0
  146. package/dist/server/toolRegistry.js +272 -0
  147. package/dist/tools/__tests__/deltaTestUtils.d.ts +18 -0
  148. package/dist/tools/__tests__/deltaTestUtils.js +26 -0
  149. package/dist/tools/accountTools.d.ts +37 -0
  150. package/dist/tools/accountTools.js +175 -0
  151. package/dist/tools/budgetTools.d.ts +10 -0
  152. package/dist/tools/budgetTools.js +68 -0
  153. package/dist/tools/categoryTools.d.ts +27 -0
  154. package/dist/tools/categoryTools.js +232 -0
  155. package/dist/tools/compareTransactions/formatter.d.ts +71 -0
  156. package/dist/tools/compareTransactions/formatter.js +97 -0
  157. package/dist/tools/compareTransactions/index.d.ts +30 -0
  158. package/dist/tools/compareTransactions/index.js +160 -0
  159. package/dist/tools/compareTransactions/matcher.d.ts +12 -0
  160. package/dist/tools/compareTransactions/matcher.js +140 -0
  161. package/dist/tools/compareTransactions/parser.d.ts +14 -0
  162. package/dist/tools/compareTransactions/parser.js +430 -0
  163. package/dist/tools/compareTransactions/types.d.ts +27 -0
  164. package/dist/tools/compareTransactions/types.js +1 -0
  165. package/dist/tools/compareTransactions.d.ts +1 -0
  166. package/dist/tools/compareTransactions.js +1 -0
  167. package/dist/tools/deltaFetcher.d.ts +22 -0
  168. package/dist/tools/deltaFetcher.js +137 -0
  169. package/dist/tools/deltaSupport.d.ts +20 -0
  170. package/dist/tools/deltaSupport.js +176 -0
  171. package/dist/tools/exportTransactions.d.ts +17 -0
  172. package/dist/tools/exportTransactions.js +191 -0
  173. package/dist/tools/monthTools.d.ts +16 -0
  174. package/dist/tools/monthTools.js +107 -0
  175. package/dist/tools/payeeTools.d.ts +17 -0
  176. package/dist/tools/payeeTools.js +82 -0
  177. package/dist/tools/reconcileAdapter.d.ts +25 -0
  178. package/dist/tools/reconcileAdapter.js +167 -0
  179. package/dist/tools/reconciliation/analyzer.d.ts +3 -0
  180. package/dist/tools/reconciliation/analyzer.js +567 -0
  181. package/dist/tools/reconciliation/executor.d.ts +94 -0
  182. package/dist/tools/reconciliation/executor.js +611 -0
  183. package/dist/tools/reconciliation/index.d.ts +54 -0
  184. package/dist/tools/reconciliation/index.js +249 -0
  185. package/dist/tools/reconciliation/matcher.d.ts +3 -0
  186. package/dist/tools/reconciliation/matcher.js +160 -0
  187. package/dist/tools/reconciliation/payeeNormalizer.d.ts +6 -0
  188. package/dist/tools/reconciliation/payeeNormalizer.js +77 -0
  189. package/dist/tools/reconciliation/recommendationEngine.d.ts +2 -0
  190. package/dist/tools/reconciliation/recommendationEngine.js +273 -0
  191. package/dist/tools/reconciliation/reportFormatter.d.ts +13 -0
  192. package/dist/tools/reconciliation/reportFormatter.js +214 -0
  193. package/dist/tools/reconciliation/types.d.ts +172 -0
  194. package/dist/tools/reconciliation/types.js +7 -0
  195. package/dist/tools/schemas/outputs/accountOutputs.d.ts +58 -0
  196. package/dist/tools/schemas/outputs/accountOutputs.js +24 -0
  197. package/dist/tools/schemas/outputs/budgetOutputs.d.ts +48 -0
  198. package/dist/tools/schemas/outputs/budgetOutputs.js +15 -0
  199. package/dist/tools/schemas/outputs/categoryOutputs.d.ts +93 -0
  200. package/dist/tools/schemas/outputs/categoryOutputs.js +37 -0
  201. package/dist/tools/schemas/outputs/comparisonOutputs.d.ts +269 -0
  202. package/dist/tools/schemas/outputs/comparisonOutputs.js +181 -0
  203. package/dist/tools/schemas/outputs/index.d.ts +14 -0
  204. package/dist/tools/schemas/outputs/index.js +14 -0
  205. package/dist/tools/schemas/outputs/monthOutputs.d.ts +122 -0
  206. package/dist/tools/schemas/outputs/monthOutputs.js +51 -0
  207. package/dist/tools/schemas/outputs/payeeOutputs.d.ts +34 -0
  208. package/dist/tools/schemas/outputs/payeeOutputs.js +16 -0
  209. package/dist/tools/schemas/outputs/reconciliationOutputs.d.ts +1275 -0
  210. package/dist/tools/schemas/outputs/reconciliationOutputs.js +377 -0
  211. package/dist/tools/schemas/outputs/transactionMutationOutputs.d.ts +717 -0
  212. package/dist/tools/schemas/outputs/transactionMutationOutputs.js +260 -0
  213. package/dist/tools/schemas/outputs/transactionOutputs.d.ts +98 -0
  214. package/dist/tools/schemas/outputs/transactionOutputs.js +49 -0
  215. package/dist/tools/schemas/outputs/utilityOutputs.d.ts +219 -0
  216. package/dist/tools/schemas/outputs/utilityOutputs.js +120 -0
  217. package/dist/tools/schemas/shared/commonOutputs.d.ts +24 -0
  218. package/dist/tools/schemas/shared/commonOutputs.js +27 -0
  219. package/dist/tools/toolCategories.d.ts +32 -0
  220. package/dist/tools/toolCategories.js +32 -0
  221. package/dist/tools/transactionTools.d.ts +315 -0
  222. package/dist/tools/transactionTools.js +1722 -0
  223. package/dist/tools/utilityTools.d.ts +10 -0
  224. package/dist/tools/utilityTools.js +56 -0
  225. package/dist/types/index.d.ts +20 -0
  226. package/dist/types/index.js +16 -0
  227. package/dist/types/toolAnnotations.d.ts +7 -0
  228. package/dist/types/toolAnnotations.js +1 -0
  229. package/dist/utils/amountUtils.d.ts +3 -0
  230. package/dist/utils/amountUtils.js +10 -0
  231. package/dist/utils/dateUtils.d.ts +9 -0
  232. package/dist/utils/dateUtils.js +43 -0
  233. package/dist/utils/money.d.ts +21 -0
  234. package/dist/utils/money.js +51 -0
  235. package/docs/README.md +72 -0
  236. package/docs/assets/examples/reconciliation-with-recommendations.json +68 -0
  237. package/docs/assets/schemas/reconciliation-v2.json +338 -0
  238. package/docs/getting-started/CONFIGURATION.md +175 -0
  239. package/docs/getting-started/INSTALLATION.md +333 -0
  240. package/docs/getting-started/QUICKSTART.md +282 -0
  241. package/docs/guides/ARCHITECTURE.md +650 -0
  242. package/docs/guides/DEPLOYMENT.md +189 -0
  243. package/docs/guides/INTEGRATION_TESTING.md +730 -0
  244. package/docs/guides/TESTING.md +591 -0
  245. package/docs/reconciliation-flow.md +83 -0
  246. package/docs/reference/API.md +1450 -0
  247. package/docs/reference/EXAMPLES.md +946 -0
  248. package/docs/reference/TOOLS.md +348 -0
  249. package/docs/reference/TROUBLESHOOTING.md +481 -0
  250. package/esbuild.config.mjs +68 -0
  251. package/eslint.config.js +49 -0
  252. package/fix-types.sh +17 -0
  253. package/meta.json +12550 -0
  254. package/package.json +105 -0
  255. package/package.json.tmp +105 -0
  256. package/scripts/analyze-bundle.mjs +41 -0
  257. package/scripts/create-pr-description.js +203 -0
  258. package/scripts/generate-mcpb.ps1 +96 -0
  259. package/scripts/run-domain-integration-tests.js +33 -0
  260. package/scripts/run-generate-mcpb.js +29 -0
  261. package/scripts/run-throttled-integration-tests.js +116 -0
  262. package/scripts/test-delta-params.mjs +140 -0
  263. package/scripts/test-recommendations.ts +53 -0
  264. package/scripts/tmpTransaction.ts +48 -0
  265. package/scripts/validate-env.js +122 -0
  266. package/scripts/verify-build.js +105 -0
  267. package/scripts/watch-and-restart.ps1 +50 -0
  268. package/src/__tests__/comprehensive.integration.test.ts +1196 -0
  269. package/src/__tests__/delta.performance.test.ts +80 -0
  270. package/src/__tests__/performance.test.ts +725 -0
  271. package/src/__tests__/setup.ts +449 -0
  272. package/src/__tests__/testRunner.ts +444 -0
  273. package/src/__tests__/testUtils.ts +563 -0
  274. package/src/__tests__/workflows.e2e.test.ts +1675 -0
  275. package/src/index.ts +124 -0
  276. package/src/server/.gitkeep +1 -0
  277. package/src/server/YNABMCPServer.ts +1188 -0
  278. package/src/server/__tests__/YNABMCPServer.integration.test.ts +903 -0
  279. package/src/server/__tests__/YNABMCPServer.test.ts +894 -0
  280. package/src/server/__tests__/budgetResolver.test.ts +425 -0
  281. package/src/server/__tests__/cacheManager.test.ts +880 -0
  282. package/src/server/__tests__/config.test.ts +166 -0
  283. package/src/server/__tests__/deltaCache.merge.test.ts +724 -0
  284. package/src/server/__tests__/deltaCache.swr.test.ts +168 -0
  285. package/src/server/__tests__/deltaCache.test.ts +774 -0
  286. package/src/server/__tests__/diagnostics.test.ts +823 -0
  287. package/src/server/__tests__/errorHandler.integration.test.ts +466 -0
  288. package/src/server/__tests__/errorHandler.test.ts +416 -0
  289. package/src/server/__tests__/prompts.test.ts +354 -0
  290. package/src/server/__tests__/rateLimiter.test.ts +314 -0
  291. package/src/server/__tests__/requestLogger.test.ts +408 -0
  292. package/src/server/__tests__/resources.test.ts +299 -0
  293. package/src/server/__tests__/security.integration.test.ts +426 -0
  294. package/src/server/__tests__/securityMiddleware.test.ts +449 -0
  295. package/src/server/__tests__/server-startup.integration.test.ts +477 -0
  296. package/src/server/__tests__/serverKnowledgeStore.test.ts +174 -0
  297. package/src/server/__tests__/toolRegistry.test.ts +855 -0
  298. package/src/server/budgetResolver.ts +235 -0
  299. package/src/server/cacheManager.ts +503 -0
  300. package/src/server/config.ts +41 -0
  301. package/src/server/deltaCache.merge.ts +149 -0
  302. package/src/server/deltaCache.ts +341 -0
  303. package/src/server/diagnostics.ts +338 -0
  304. package/src/server/errorHandler.ts +756 -0
  305. package/src/server/prompts.ts +291 -0
  306. package/src/server/rateLimiter.ts +156 -0
  307. package/src/server/requestLogger.ts +344 -0
  308. package/src/server/resources.ts +168 -0
  309. package/src/server/responseFormatter.ts +51 -0
  310. package/src/server/securityMiddleware.ts +236 -0
  311. package/src/server/serverKnowledgeStore.ts +91 -0
  312. package/src/server/toolRegistry.ts +489 -0
  313. package/src/tools/.gitkeep +1 -0
  314. package/src/tools/__tests__/accountTools.delta.integration.test.ts +128 -0
  315. package/src/tools/__tests__/accountTools.integration.test.ts +117 -0
  316. package/src/tools/__tests__/accountTools.test.ts +653 -0
  317. package/src/tools/__tests__/budgetTools.delta.integration.test.ts +90 -0
  318. package/src/tools/__tests__/budgetTools.integration.test.ts +134 -0
  319. package/src/tools/__tests__/budgetTools.test.ts +423 -0
  320. package/src/tools/__tests__/categoryTools.delta.integration.test.ts +80 -0
  321. package/src/tools/__tests__/categoryTools.integration.test.ts +295 -0
  322. package/src/tools/__tests__/categoryTools.test.ts +622 -0
  323. package/src/tools/__tests__/compareTransactions/formatter.test.ts +486 -0
  324. package/src/tools/__tests__/compareTransactions/index.test.ts +383 -0
  325. package/src/tools/__tests__/compareTransactions/matcher.test.ts +410 -0
  326. package/src/tools/__tests__/compareTransactions/parser.test.ts +764 -0
  327. package/src/tools/__tests__/compareTransactions.test.ts +342 -0
  328. package/src/tools/__tests__/compareTransactions.window.test.ts +147 -0
  329. package/src/tools/__tests__/deltaFetcher.scheduled.integration.test.ts +76 -0
  330. package/src/tools/__tests__/deltaFetcher.test.ts +270 -0
  331. package/src/tools/__tests__/deltaSupport.test.ts +188 -0
  332. package/src/tools/__tests__/deltaTestUtils.ts +46 -0
  333. package/src/tools/__tests__/exportTransactions.test.ts +213 -0
  334. package/src/tools/__tests__/monthTools.delta.integration.test.ts +80 -0
  335. package/src/tools/__tests__/monthTools.integration.test.ts +174 -0
  336. package/src/tools/__tests__/monthTools.test.ts +523 -0
  337. package/src/tools/__tests__/payeeTools.delta.integration.test.ts +80 -0
  338. package/src/tools/__tests__/payeeTools.integration.test.ts +150 -0
  339. package/src/tools/__tests__/payeeTools.test.ts +445 -0
  340. package/src/tools/__tests__/transactionTools.integration.test.ts +762 -0
  341. package/src/tools/__tests__/transactionTools.test.ts +3521 -0
  342. package/src/tools/__tests__/utilityTools.integration.test.ts +128 -0
  343. package/src/tools/__tests__/utilityTools.test.ts +205 -0
  344. package/src/tools/accountTools.ts +283 -0
  345. package/src/tools/budgetTools.ts +112 -0
  346. package/src/tools/categoryTools.ts +366 -0
  347. package/src/tools/compareTransactions/formatter.ts +163 -0
  348. package/src/tools/compareTransactions/index.ts +228 -0
  349. package/src/tools/compareTransactions/matcher.ts +240 -0
  350. package/src/tools/compareTransactions/parser.ts +557 -0
  351. package/src/tools/compareTransactions/types.ts +60 -0
  352. package/src/tools/compareTransactions.ts +3 -0
  353. package/src/tools/deltaFetcher.ts +278 -0
  354. package/src/tools/deltaSupport.ts +293 -0
  355. package/src/tools/exportTransactions.ts +273 -0
  356. package/src/tools/monthTools.ts +164 -0
  357. package/src/tools/payeeTools.ts +140 -0
  358. package/src/tools/reconcileAdapter.ts +312 -0
  359. package/src/tools/reconciliation/__tests__/adapter.causes.test.ts +122 -0
  360. package/src/tools/reconciliation/__tests__/adapter.test.ts +234 -0
  361. package/src/tools/reconciliation/__tests__/analyzer.test.ts +406 -0
  362. package/src/tools/reconciliation/__tests__/executor.integration.test.ts +366 -0
  363. package/src/tools/reconciliation/__tests__/executor.test.ts +779 -0
  364. package/src/tools/reconciliation/__tests__/matcher.test.ts +650 -0
  365. package/src/tools/reconciliation/__tests__/payeeNormalizer.test.ts +278 -0
  366. package/src/tools/reconciliation/__tests__/recommendationEngine.integration.test.ts +658 -0
  367. package/src/tools/reconciliation/__tests__/recommendationEngine.test.ts +1000 -0
  368. package/src/tools/reconciliation/__tests__/reconciliation.delta.integration.test.ts +151 -0
  369. package/src/tools/reconciliation/__tests__/reportFormatter.test.ts +573 -0
  370. package/src/tools/reconciliation/__tests__/scenarios/adapterCurrency.scenario.test.ts +78 -0
  371. package/src/tools/reconciliation/__tests__/scenarios/extremes.scenario.test.ts +47 -0
  372. package/src/tools/reconciliation/__tests__/scenarios/repeatAmount.scenario.test.ts +61 -0
  373. package/src/tools/reconciliation/__tests__/schemaUrl.test.ts +49 -0
  374. package/src/tools/reconciliation/analyzer.ts +824 -0
  375. package/src/tools/reconciliation/executor.ts +880 -0
  376. package/src/tools/reconciliation/index.ts +400 -0
  377. package/src/tools/reconciliation/matcher.ts +269 -0
  378. package/src/tools/reconciliation/payeeNormalizer.ts +167 -0
  379. package/src/tools/reconciliation/recommendationEngine.ts +506 -0
  380. package/src/tools/reconciliation/reportFormatter.ts +363 -0
  381. package/src/tools/reconciliation/types.ts +314 -0
  382. package/src/tools/schemas/outputs/__tests__/accountOutputs.test.ts +424 -0
  383. package/src/tools/schemas/outputs/__tests__/budgetOutputs.test.ts +310 -0
  384. package/src/tools/schemas/outputs/__tests__/categoryOutputs.test.ts +448 -0
  385. package/src/tools/schemas/outputs/__tests__/comparisonOutputs.test.ts +519 -0
  386. package/src/tools/schemas/outputs/__tests__/dateValidation.test.ts +155 -0
  387. package/src/tools/schemas/outputs/__tests__/discrepancyDirection.test.ts +288 -0
  388. package/src/tools/schemas/outputs/__tests__/monthOutputs.test.ts +478 -0
  389. package/src/tools/schemas/outputs/__tests__/payeeOutputs.test.ts +370 -0
  390. package/src/tools/schemas/outputs/__tests__/reconciliationOutputs.test.ts +401 -0
  391. package/src/tools/schemas/outputs/__tests__/transactionMutationSchemas.test.ts +213 -0
  392. package/src/tools/schemas/outputs/__tests__/transactionOutputs.test.ts +474 -0
  393. package/src/tools/schemas/outputs/__tests__/utilityOutputs.test.ts +333 -0
  394. package/src/tools/schemas/outputs/accountOutputs.ts +137 -0
  395. package/src/tools/schemas/outputs/budgetOutputs.ts +86 -0
  396. package/src/tools/schemas/outputs/categoryOutputs.ts +194 -0
  397. package/src/tools/schemas/outputs/comparisonOutputs.ts +600 -0
  398. package/src/tools/schemas/outputs/index.ts +270 -0
  399. package/src/tools/schemas/outputs/monthOutputs.ts +243 -0
  400. package/src/tools/schemas/outputs/payeeOutputs.ts +105 -0
  401. package/src/tools/schemas/outputs/reconciliationOutputs.ts +796 -0
  402. package/src/tools/schemas/outputs/transactionMutationOutputs.ts +758 -0
  403. package/src/tools/schemas/outputs/transactionOutputs.ts +243 -0
  404. package/src/tools/schemas/outputs/utilityOutputs.ts +411 -0
  405. package/src/tools/schemas/shared/commonOutputs.ts +140 -0
  406. package/src/tools/toolCategories.ts +140 -0
  407. package/src/tools/transactionTools.ts +2509 -0
  408. package/src/tools/utilityTools.ts +90 -0
  409. package/src/types/.gitkeep +1 -0
  410. package/src/types/__tests__/index.test.ts +52 -0
  411. package/src/types/index.ts +67 -0
  412. package/src/types/integration-tests.d.ts +35 -0
  413. package/src/types/toolAnnotations.ts +44 -0
  414. package/src/utils/__tests__/dateUtils.test.ts +170 -0
  415. package/src/utils/__tests__/money.test.ts +189 -0
  416. package/src/utils/amountUtils.ts +32 -0
  417. package/src/utils/dateUtils.ts +108 -0
  418. package/src/utils/money.ts +123 -0
  419. package/test-csv-sample.csv +28 -0
  420. package/test-exports/sample_bank_statement.csv +7 -0
  421. package/test-exports/ynab_account_e9ddc2a6_minimal_1items_2025-11-19_09-04-53.json +23 -0
  422. package/test-exports/ynab_account_e9ddc2a6_minimal_1items_2025-11-19_10-37-42.json +23 -0
  423. package/test-exports/ynab_account_e9ddc2a6_minimal_4items_2025-11-19_09-02-09.json +44 -0
  424. package/test-exports/ynab_account_e9ddc2a6_minimal_6items_2025-11-19_10-37-52.json +58 -0
  425. package/test-exports/ynab_since_2025-11-01_account_4c18e9f0_minimal_14items_2025-11-16_10-07-10.json +115 -0
  426. package/test-reconcile-autodetect.js +40 -0
  427. package/test-reconcile-tool.js +152 -0
  428. package/test-reconcile-with-csv.cjs +89 -0
  429. package/test-statement.csv +8 -0
  430. package/test_debug.js +47 -0
  431. package/test_simple.mjs +16 -0
  432. package/tsconfig.json +31 -0
  433. package/tsconfig.prod.json +18 -0
  434. package/vitest-reporters/split-json-reporter.ts +211 -0
  435. package/vitest.config.ts +96 -0
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Unified date utilities for YNAB MCP Server
3
+ *
4
+ * All date formatting should use these utilities to ensure consistency
5
+ * and prevent bugs like the duplicate month issue.
6
+ *
7
+ * Uses date-fns internally for robust date operations while providing
8
+ * YNAB-specific business logic.
9
+ */
10
+
11
+ import { format, subMonths, isValid, parse } from 'date-fns';
12
+
13
+ /**
14
+ * Formats a date as YYYY-MM-01 (YNAB month format)
15
+ * @param date The date to format
16
+ * @returns Formatted date string in YYYY-MM-01 format
17
+ */
18
+ export function formatYNABMonth(date: Date): string {
19
+ return format(date, "yyyy-MM-'01'");
20
+ }
21
+
22
+ /**
23
+ * Formats a date as YYYY-MM-DD (ISO date format)
24
+ * @param date The date to format
25
+ * @returns Formatted date string in YYYY-MM-DD format
26
+ */
27
+ export function formatISODate(date: Date): string {
28
+ return format(date, 'yyyy-MM-dd');
29
+ }
30
+
31
+ /**
32
+ * Gets the current month in YNAB format (YYYY-MM-01)
33
+ * @returns Current month formatted as YYYY-MM-01
34
+ */
35
+ export function getCurrentMonth(): string {
36
+ return formatYNABMonth(new Date());
37
+ }
38
+
39
+ /**
40
+ * Gets today's date in ISO format (YYYY-MM-DD)
41
+ * @returns Today's date formatted as YYYY-MM-DD
42
+ */
43
+ export function getToday(): string {
44
+ return formatISODate(new Date());
45
+ }
46
+
47
+ /**
48
+ * Generates an array of historical months going backwards from a start date
49
+ * @param monthCount Number of months to generate
50
+ * @param startDate The starting date (defaults to current date)
51
+ * @returns Array of month strings in YYYY-MM-01 format, ordered newest to oldest
52
+ */
53
+ export function getHistoricalMonths(monthCount: number, startDate?: Date): string[] {
54
+ const baseDate = startDate || new Date();
55
+
56
+ return Array.from({ length: monthCount }, (_, i) => {
57
+ const date = subMonths(baseDate, i);
58
+ return formatYNABMonth(date);
59
+ });
60
+ }
61
+
62
+ /**
63
+ * Subtracts months from a date
64
+ * @param date The base date
65
+ * @param months Number of months to subtract
66
+ * @returns New date with months subtracted
67
+ */
68
+ export function subtractMonths(date: Date, months: number): Date {
69
+ return subMonths(date, months);
70
+ }
71
+
72
+ /**
73
+ * Validates if a string is in YYYY-MM-DD format
74
+ * @param dateString The string to validate
75
+ * @returns True if valid ISO date format
76
+ */
77
+ export function isValidISODate(dateString: string): boolean {
78
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(dateString)) {
79
+ return false;
80
+ }
81
+ const parsed = parse(dateString, 'yyyy-MM-dd', new Date());
82
+ return isValid(parsed);
83
+ }
84
+
85
+ /**
86
+ * Validates if a string is in YYYY-MM-01 format (YNAB month format)
87
+ * @param monthString The string to validate
88
+ * @returns True if valid YNAB month format
89
+ */
90
+ export function isValidYNABMonth(monthString: string): boolean {
91
+ if (!/^\d{4}-\d{2}-01$/.test(monthString)) {
92
+ return false;
93
+ }
94
+ const parsed = parse(monthString, "yyyy-MM-'01'", new Date());
95
+ return isValid(parsed);
96
+ }
97
+
98
+ /**
99
+ * Converts a YYYY-MM format to YYYY-MM-01 format
100
+ * @param yearMonth String in YYYY-MM format
101
+ * @returns String in YYYY-MM-01 format
102
+ */
103
+ export function yearMonthToYNABMonth(yearMonth: string): string {
104
+ if (!/^\d{4}-\d{2}$/.test(yearMonth)) {
105
+ throw new Error('Invalid year-month format. Expected YYYY-MM');
106
+ }
107
+ return `${yearMonth}-01`;
108
+ }
@@ -0,0 +1,123 @@
1
+ // money.ts
2
+ import * as ynab from 'ynab';
3
+
4
+ export type Milli = number; // integer milliunits (no bigint)
5
+
6
+ export type MoneyDirection = 'credit' | 'debit' | 'balanced';
7
+
8
+ export interface MoneyValue {
9
+ value_milliunits: Milli;
10
+ value: number;
11
+ value_display: string;
12
+ currency: string;
13
+ direction: MoneyDirection;
14
+ }
15
+
16
+ const DEFAULT_CURRENCY = 'USD';
17
+ const DEFAULT_DECIMAL_DIGITS = 2;
18
+
19
+ /**
20
+ * Extract decimal digits from YNAB CurrencyFormat
21
+ */
22
+ export const getDecimalDigits = (
23
+ currencyFormat: ynab.CurrencyFormat | null | undefined,
24
+ ): number => {
25
+ return currencyFormat?.decimal_digits ?? DEFAULT_DECIMAL_DIGITS;
26
+ };
27
+
28
+ /**
29
+ * Extract ISO currency code from YNAB CurrencyFormat
30
+ */
31
+ export const getCurrencyCode = (currencyFormat: ynab.CurrencyFormat | null | undefined): string => {
32
+ return currencyFormat?.iso_code ?? DEFAULT_CURRENCY;
33
+ };
34
+
35
+ export const toMilli = (x: number | string): Milli => {
36
+ const n = Number(x);
37
+ const m = Math.round(n * 1000);
38
+ if (!Number.isFinite(n) || !Number.isSafeInteger(m)) {
39
+ throw new Error(`Invalid/unsafe amount: ${x}`);
40
+ }
41
+ return m;
42
+ };
43
+
44
+ /**
45
+ * Convert milliunits to currency amount using proper decimal digits
46
+ * Uses YNAB SDK's conversion logic which handles different currency formats
47
+ * @param m - Milliunits value
48
+ * @param decimalDigits - Number of decimal digits for the currency (default: 2 for USD/EUR, 0 for JPY, 3 for BHD, etc.)
49
+ */
50
+ export const fromMilli = (m: Milli, decimalDigits: number = DEFAULT_DECIMAL_DIGITS): number => {
51
+ return ynab.utils.convertMilliUnitsToCurrencyAmount(m, decimalDigits);
52
+ };
53
+
54
+ export const assertMilli = (m: number, msg = 'Expected safe integer milliunits') => {
55
+ if (!Number.isSafeInteger(m)) throw new Error(msg);
56
+ };
57
+
58
+ export const addMilli = (a: Milli, b: Milli): Milli => {
59
+ const s = a + b;
60
+ if (!Number.isSafeInteger(s)) throw new Error('Milliunit sum overflow');
61
+ return s;
62
+ };
63
+
64
+ export const inWindow = (
65
+ iso: string,
66
+ start: string | undefined = undefined,
67
+ end: string | undefined = undefined,
68
+ ) => (!start || iso >= start) && (!end || iso <= end);
69
+
70
+ export const moneyDirection = (value: Milli): MoneyDirection => {
71
+ if (value === 0) return 'balanced';
72
+ return value > 0 ? 'credit' : 'debit';
73
+ };
74
+
75
+ const makeFormatter = (currency: string, decimalDigits: number = DEFAULT_DECIMAL_DIGITS) =>
76
+ new Intl.NumberFormat('en-US', {
77
+ style: 'currency',
78
+ currency,
79
+ minimumFractionDigits: decimalDigits,
80
+ maximumFractionDigits: decimalDigits,
81
+ });
82
+
83
+ /**
84
+ * Format milliunits as currency string with proper decimal digits
85
+ * @param value - Milliunits value
86
+ * @param currency - ISO currency code (default: USD)
87
+ * @param decimalDigits - Number of decimal digits (default: 2)
88
+ */
89
+ export const formatMoney = (
90
+ value: Milli,
91
+ currency: string = DEFAULT_CURRENCY,
92
+ decimalDigits: number = DEFAULT_DECIMAL_DIGITS,
93
+ ): string => makeFormatter(currency, decimalDigits).format(fromMilli(value, decimalDigits));
94
+
95
+ /**
96
+ * Convert milliunits to MoneyValue with proper currency format
97
+ * @param value - Milliunits value
98
+ * @param currency - ISO currency code (default: USD)
99
+ * @param decimalDigits - Number of decimal digits (default: 2)
100
+ */
101
+ export const toMoneyValue = (
102
+ value: Milli,
103
+ currency: string = DEFAULT_CURRENCY,
104
+ decimalDigits: number = DEFAULT_DECIMAL_DIGITS,
105
+ ): MoneyValue => ({
106
+ value_milliunits: value,
107
+ value: fromMilli(value, decimalDigits),
108
+ value_display: formatMoney(value, currency, decimalDigits),
109
+ currency,
110
+ direction: moneyDirection(value),
111
+ });
112
+
113
+ /**
114
+ * Convert decimal amount to MoneyValue
115
+ * @param amount - Decimal amount
116
+ * @param currency - ISO currency code (default: USD)
117
+ * @param decimalDigits - Number of decimal digits (default: 2)
118
+ */
119
+ export const toMoneyValueFromDecimal = (
120
+ amount: number,
121
+ currency: string = DEFAULT_CURRENCY,
122
+ decimalDigits: number = DEFAULT_DECIMAL_DIGITS,
123
+ ): MoneyValue => toMoneyValue(toMilli(amount), currency, decimalDigits);
@@ -0,0 +1,28 @@
1
+ Date,Description,Amount,Balance
2
+ 2024-01-15,"GROCERY STORE PURCHASE",-45.67,1234.56
3
+ 2024-01-16,"PAYCHECK DEPOSIT",2500.00,3734.56
4
+ 2024-01-17,"COFFEE SHOP",-4.25,3730.31
5
+ 2024-01-18,"ATM WITHDRAWAL",-60.00,3670.31
6
+ 2024-01-19,"ONLINE PURCHASE - AMAZON",-23.45,3646.86
7
+ 2024-01-20,"RESTAURANT DINNER",-78.90,3567.96
8
+ 2024-01-22,"GAS STATION",-52.34,3515.62
9
+ 2024-01-23,"PHARMACY",-12.67,3502.95
10
+ 2024-01-24,"UTILITY PAYMENT",-125.00,3377.95
11
+ 2024-01-25,"GROCERY STORE PURCHASE",-67.89,3310.06
12
+ 2024-01-26,"MOBILE PHONE BILL",-85.00,3225.06
13
+ 2024-01-29,"RESTAURANT LUNCH",-18.45,3206.61
14
+ 2024-01-30,"BANK INTEREST EARNED",2.15,3208.76
15
+ 2024-01-31,"MONTHLY RENT",-1200.00,2008.76
16
+ 2024-02-01,"COFFEE SHOP",-4.75,2004.01
17
+ 2024-02-02,"GROCERY STORE PURCHASE",-89.23,1914.78
18
+ 2024-02-03,"MOVIE THEATER",-24.00,1890.78
19
+ 2024-02-05,"ONLINE SUBSCRIPTION",-9.99,1880.79
20
+ 2024-02-06,"RESTAURANT DINNER",-56.78,1823.01
21
+ 2024-02-07,"GAS STATION",-48.90,1774.11
22
+ 2024-02-08,"PHARMACY",-15.67,1758.44
23
+ 2024-02-09,"GROCERY STORE PURCHASE",-34.56,1723.88
24
+ 2024-02-12,"PAYCHECK DEPOSIT",2500.00,4223.88
25
+ 2024-02-13,"INSURANCE PAYMENT",-150.00,4073.88
26
+ 2024-02-14,"RESTAURANT VALENTINE",-95.67,3978.21
27
+ 2024-02-15,"DUPLICATE AMOUNT TEST",-45.67,3932.54
28
+ 2024-02-16,"PENDING TRANSACTION",-123.45,3809.09
@@ -0,0 +1,7 @@
1
+ Date,Amount,Description
2
+ 01/15/2025,25.50,Coffee Shop Purchase
3
+ 01/16/2025,-100.00,ATM Withdrawal
4
+ 01/17/2025,45.75,Grocery Store
5
+ 01/18/2025,15.99,Netflix Subscription
6
+ 01/19/2025,200.00,Paycheck Deposit
7
+ 01/20/2025,32.45,Gas Station
@@ -0,0 +1,23 @@
1
+ {
2
+ "export_info": {
3
+ "exported_at": "2025-11-19T17:04:53.492Z",
4
+ "total_transactions": 1,
5
+ "minimal": true,
6
+ "filters": {
7
+ "budget_id": "7b47d8bb-ce4c-40c0-a9eb-c6d715af9a76",
8
+ "account_id": "e9ddc2a6-f4ae-4f95-b45a-831cf1d7b90c",
9
+ "category_id": null,
10
+ "since_date": null,
11
+ "type": null
12
+ }
13
+ },
14
+ "transactions": [
15
+ {
16
+ "id": "93e4355b-6c45-4f73-899d-53b2c4ef8c7d",
17
+ "date": "2025-11-17",
18
+ "amount": 10000000,
19
+ "payee_name": "Starting Balance",
20
+ "cleared": "cleared"
21
+ }
22
+ ]
23
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "export_info": {
3
+ "exported_at": "2025-11-19T18:37:42.030Z",
4
+ "total_transactions": 1,
5
+ "minimal": true,
6
+ "filters": {
7
+ "budget_id": "7b47d8bb-ce4c-40c0-a9eb-c6d715af9a76",
8
+ "account_id": "e9ddc2a6-f4ae-4f95-b45a-831cf1d7b90c",
9
+ "category_id": null,
10
+ "since_date": null,
11
+ "type": null
12
+ }
13
+ },
14
+ "transactions": [
15
+ {
16
+ "id": "93e4355b-6c45-4f73-899d-53b2c4ef8c7d",
17
+ "date": "2025-11-17",
18
+ "amount": 10000000,
19
+ "payee_name": "Starting Balance",
20
+ "cleared": "cleared"
21
+ }
22
+ ]
23
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "export_info": {
3
+ "exported_at": "2025-11-19T17:02:09.880Z",
4
+ "total_transactions": 4,
5
+ "minimal": true,
6
+ "filters": {
7
+ "budget_id": "7b47d8bb-ce4c-40c0-a9eb-c6d715af9a76",
8
+ "account_id": "e9ddc2a6-f4ae-4f95-b45a-831cf1d7b90c",
9
+ "category_id": null,
10
+ "since_date": null,
11
+ "type": null
12
+ }
13
+ },
14
+ "transactions": [
15
+ {
16
+ "id": "93e4355b-6c45-4f73-899d-53b2c4ef8c7d",
17
+ "date": "2025-11-17",
18
+ "amount": 10000000,
19
+ "payee_name": "Starting Balance",
20
+ "cleared": "cleared"
21
+ },
22
+ {
23
+ "id": "1aa8be76-7b33-471d-8a6c-dd3193b8c7e0",
24
+ "date": "2025-11-19",
25
+ "amount": -3000,
26
+ "payee_name": "Test Update Payee 1763571729127",
27
+ "cleared": "uncleared"
28
+ },
29
+ {
30
+ "id": "fce0d2e4-91aa-4d37-abcd-33dfb4e9d803",
31
+ "date": "2025-11-19",
32
+ "amount": -2000,
33
+ "payee_name": "Test Payee 2 1763571728468",
34
+ "cleared": "uncleared"
35
+ },
36
+ {
37
+ "id": "b26a77cc-6cc4-4e2d-8ffa-72fcd00a2cde",
38
+ "date": "2025-11-19",
39
+ "amount": -1000,
40
+ "payee_name": "Test Payee 1 1763571728468",
41
+ "cleared": "uncleared"
42
+ }
43
+ ]
44
+ }
@@ -0,0 +1,58 @@
1
+ {
2
+ "export_info": {
3
+ "exported_at": "2025-11-19T18:37:52.409Z",
4
+ "total_transactions": 6,
5
+ "minimal": true,
6
+ "filters": {
7
+ "budget_id": "7b47d8bb-ce4c-40c0-a9eb-c6d715af9a76",
8
+ "account_id": "e9ddc2a6-f4ae-4f95-b45a-831cf1d7b90c",
9
+ "category_id": null,
10
+ "since_date": null,
11
+ "type": null
12
+ }
13
+ },
14
+ "transactions": [
15
+ {
16
+ "id": "93e4355b-6c45-4f73-899d-53b2c4ef8c7d",
17
+ "date": "2025-11-17",
18
+ "amount": 10000000,
19
+ "payee_name": "Starting Balance",
20
+ "cleared": "cleared"
21
+ },
22
+ {
23
+ "id": "fa32d5e7-76c5-46f0-9daa-c96a06b0a16c",
24
+ "date": "2025-11-19",
25
+ "amount": -3000,
26
+ "payee_name": "Test Update Payee 1763577471655",
27
+ "cleared": "uncleared"
28
+ },
29
+ {
30
+ "id": "883f3e33-e8fd-48d7-bb1f-55803b7c310b",
31
+ "date": "2025-11-19",
32
+ "amount": -2500,
33
+ "payee_name": "Bulk Workflow Payee 2 1763577462035",
34
+ "cleared": "uncleared"
35
+ },
36
+ {
37
+ "id": "d0ef74ff-a0d3-4f81-ab00-355eee55d6f1",
38
+ "date": "2025-11-19",
39
+ "amount": -2000,
40
+ "payee_name": "Test Payee 2 1763577471385",
41
+ "cleared": "uncleared"
42
+ },
43
+ {
44
+ "id": "863445bc-f3a6-4d5a-a2bf-6f91e39c2ec7",
45
+ "date": "2025-11-19",
46
+ "amount": -1500,
47
+ "payee_name": "Bulk Workflow Payee 1 1763577462035",
48
+ "cleared": "uncleared"
49
+ },
50
+ {
51
+ "id": "d211482a-6082-471b-a318-6679a6c35bfd",
52
+ "date": "2025-11-19",
53
+ "amount": -1000,
54
+ "payee_name": "Test Payee 1 1763577471385",
55
+ "cleared": "uncleared"
56
+ }
57
+ ]
58
+ }
@@ -0,0 +1,115 @@
1
+ {
2
+ "export_info": {
3
+ "exported_at": "2025-11-16T18:07:10.599Z",
4
+ "total_transactions": 14,
5
+ "minimal": true,
6
+ "filters": {
7
+ "budget_id": "bf00f94f-f532-4b2c-a39c-e8d9a963effd",
8
+ "account_id": "4c18e9f0-8aa6-4427-98f5-55ce81d109cf",
9
+ "category_id": null,
10
+ "since_date": "2025-11-01",
11
+ "type": null,
12
+ "minimal": true
13
+ }
14
+ },
15
+ "transactions": [
16
+ {
17
+ "id": "382cbe8c-7715-48b0-b0a6-3ac0bc17f9c2_2025-11-01",
18
+ "date": "2025-11-01",
19
+ "amount": -210000,
20
+ "payee_name": "Transfer : N πŸ‡ΌπŸ“ˆWS RESP",
21
+ "cleared": "reconciled"
22
+ },
23
+ {
24
+ "id": "b6053873-f422-480f-beb0-0d271a36f719",
25
+ "date": "2025-11-01",
26
+ "amount": -136500,
27
+ "payee_name": "Costco Annual Renewal",
28
+ "cleared": "reconciled"
29
+ },
30
+ {
31
+ "id": "47814a86-65f5-439a-8b1c-b5f50603de2c",
32
+ "date": "2025-11-02",
33
+ "amount": 637800,
34
+ "payee_name": "Mercury Speech",
35
+ "cleared": "reconciled"
36
+ },
37
+ {
38
+ "id": "5b399d5a-578f-4234-8b4c-ad0921b66a93_2025-11-05",
39
+ "date": "2025-11-05",
40
+ "amount": -46800,
41
+ "payee_name": "Empire Life",
42
+ "cleared": "reconciled"
43
+ },
44
+ {
45
+ "id": "84eff87c-0126-46f0-9bff-633604bcddec",
46
+ "date": "2025-11-06",
47
+ "amount": 2722020,
48
+ "payee_name": "Nurture Society for Learning and Development",
49
+ "cleared": "reconciled"
50
+ },
51
+ {
52
+ "id": "769efb8e-dc6e-4a12-9852-eb470f639917",
53
+ "date": "2025-11-08",
54
+ "amount": 51620,
55
+ "payee_name": "Costco",
56
+ "cleared": "reconciled"
57
+ },
58
+ {
59
+ "id": "a4172251-b266-4b83-bfd7-1433b20ffe06",
60
+ "date": "2025-11-08",
61
+ "amount": 67750,
62
+ "payee_name": "Costco",
63
+ "cleared": "reconciled"
64
+ },
65
+ {
66
+ "id": "ef42495c-7e9e-4fb6-916f-074cc1671788",
67
+ "date": "2025-11-11",
68
+ "amount": 500000,
69
+ "payee_name": "Shelby Speech All Brains Clinic",
70
+ "cleared": "reconciled"
71
+ },
72
+ {
73
+ "id": "5a7d4640-bfb1-46c6-a0c5-4884206deb65",
74
+ "date": "2025-11-14",
75
+ "amount": -2000000,
76
+ "payee_name": "Transfer : πŸ“—βœ”οΈ K TD ALL-INCLUSIVE cheq",
77
+ "cleared": "reconciled"
78
+ },
79
+ {
80
+ "id": "c9d36a31-f351-477a-9830-ed572fe00b9b",
81
+ "date": "2025-11-14",
82
+ "amount": -877860,
83
+ "payee_name": "Transfer : 🍊 πŸ’³ Tang MC",
84
+ "cleared": "reconciled"
85
+ },
86
+ {
87
+ "id": "4c35aa51-9fc2-412f-b156-04476eb8160e",
88
+ "date": "2025-11-14",
89
+ "amount": -150000,
90
+ "payee_name": "Joy Schellenberg",
91
+ "cleared": "reconciled"
92
+ },
93
+ {
94
+ "id": "890f3612-380c-460d-be46-0e672e1102c0",
95
+ "date": "2025-11-14",
96
+ "amount": -70000,
97
+ "payee_name": "Monika Szatlowska",
98
+ "cleared": "cleared"
99
+ },
100
+ {
101
+ "id": "4aa92a3b-16ff-453d-8187-63e449f7147d",
102
+ "date": "2025-11-14",
103
+ "amount": 180000,
104
+ "payee_name": "Shelby Speech Private Pay",
105
+ "cleared": "cleared"
106
+ },
107
+ {
108
+ "id": "20baeae0-341b-49d1-8507-1cc9eaf2280b",
109
+ "date": "2025-11-14",
110
+ "amount": 2560870,
111
+ "payee_name": "PHSA",
112
+ "cleared": "reconciled"
113
+ }
114
+ ]
115
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Test the auto-detect date range functionality
3
+ */
4
+
5
+ import {
6
+ extractDateRangeFromCSV,
7
+ autoDetectCSVFormat,
8
+ } from './dist/tools/compareTransactions/parser.js';
9
+
10
+ const csvContent = `Date,Description,Debit,Credit,Balance
11
+ 11/10/2025,DOLLARAMA # 109,10.91,,
12
+ 10/15/2025,Uber Trip,30.50,,
13
+ 09/22/2025,CIRCLE K # 05844 A,18.84,,`;
14
+
15
+ console.log('Testing auto-detection...');
16
+
17
+ try {
18
+ // Test 1: Auto-detect format
19
+ console.log('\n1. Auto-detecting CSV format...');
20
+ const csvFormat = autoDetectCSVFormat(csvContent);
21
+ console.log(' βœ“ Format detected:', JSON.stringify(csvFormat, null, 2));
22
+
23
+ // Test 2: Extract date range
24
+ console.log('\n2. Extracting date range...');
25
+ const { minDate, maxDate } = extractDateRangeFromCSV(csvContent, csvFormat);
26
+ console.log(` βœ“ Date range: ${minDate} to ${maxDate}`);
27
+
28
+ // Test 3: Calculate buffer date
29
+ console.log('\n3. Calculating YNAB fetch date with 7-day buffer...');
30
+ const minDateObj = new Date(minDate);
31
+ minDateObj.setDate(minDateObj.getDate() - 7);
32
+ const fetchDate = minDateObj.toISOString().split('T')[0];
33
+ console.log(` βœ“ YNAB fetch from: ${fetchDate}`);
34
+
35
+ console.log('\nβœ… All tests passed!');
36
+ } catch (error) {
37
+ console.error('\n❌ ERROR:', error.message);
38
+ console.error(error.stack);
39
+ process.exit(1);
40
+ }