@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.
- package/.chunkhound.json +11 -0
- package/.code/agents/0427d95e-edca-431f-a214-5e53264e29c4/error.txt +8 -0
- package/.code/agents/0d675174-d1e1-41c3-9975-4c2e275819a9/error.txt +3 -0
- package/.code/agents/0d8c5afd-4787-422b-abf8-2e5943fc7e67/error.txt +3 -0
- package/.code/agents/0ec34a70-ed5d-4b9e-bee4-bb0e4cccbc4b/error.txt +1 -0
- package/.code/agents/0ef51a21-1ab1-49d7-9561-0eaa43875ebc/error.txt +12 -0
- package/.code/agents/15db95d7-abad-4b4d-9c3b-8446089cb61d/error.txt +1 -0
- package/.code/agents/19ab9acb-f675-4ff0-902a-09a5476f8149/error.txt +1 -0
- package/.code/agents/1ef7e12d-f6ff-4897-8a9b-152d523d898e/error.txt +5 -0
- package/.code/agents/2465/exec-call_lroN9KKzJVWC7t5423DK1nT9.txt +1453 -0
- package/.code/agents/28edb6fe-95a9-41a0-ae69-aa0100d26c0c/error.txt +8 -0
- package/.code/agents/2ae40cf5-b4bf-42e2-92bf-7ea350a7755e/error.txt +9 -0
- package/.code/agents/2bfc4e1f-ac4b-45a5-b6df-bf89d4dbb54c/error.txt +1 -0
- package/.code/agents/2e2e1134-eff0-49be-ba25-8e2c3468a564/error.txt +5 -0
- package/.code/agents/3/exec-call_203OC4TNVkLxW7z2HCVEQ1cM.txt +81 -0
- package/.code/agents/3/exec-call_SS5T0XSiXB4LSNzUKTl75wkh.txt +610 -0
- package/.code/agents/3322c003-ce5e-48e3-a342-f5049c5bf9a2/error.txt +1 -0
- package/.code/agents/391e9b08-1ebc-468c-9bcd-6d0cc3193b37/error.txt +1 -0
- package/.code/agents/3ab0aa84-b7bb-4054-afa3-40b8fd7d3be0/error.txt +1 -0
- package/.code/agents/3bed368d-50fe-477e-aee3-a6707eaa1ab9/error.txt +3 -0
- package/.code/agents/3e40b925-db12-442f-8d7a-a25fc69a6672/error.txt +8 -0
- package/.code/agents/414d5776-cf58-41f3-9328-a6daed503a50/error.txt +5 -0
- package/.code/agents/42687751-4565-4610-b240-67835b17d861/error.txt +1 -0
- package/.code/agents/46b98876-1a39-43c9-9e2f-507ca6d47335/error.txt +9 -0
- package/.code/agents/4a7d9491-b26f-43dd-850d-2ecdc49b5d1b/error.txt +1 -0
- package/.code/agents/4e60f00a-1b3e-447f-87f3-7faf9deddec3/error.txt +13 -0
- package/.code/agents/5138fc1c-4d49-4b74-a7da-ccdb3a8e44e7/error.txt +14 -0
- package/.code/agents/521cff39-a7a3-42e5-a557-134f0f7daaa0/error.txt +5 -0
- package/.code/agents/53302dc5-3857-4413-9a47-9e0f64a51dc4/error.txt +5 -0
- package/.code/agents/567c7c2e-6a6f-4761-a08d-d36deeb2e0ac/error.txt +5 -0
- package/.code/agents/57b00845-80dc-47c9-953c-3028d16275d6/error.txt +3 -0
- package/.code/agents/593d9005-c2a5-48fd-8813-ece0d3f2de96/error.txt +1 -0
- package/.code/agents/5a112e66-0e1a-42f9-877c-53af56ea3551/error.txt +1 -0
- package/.code/agents/5b05e8ed-7788-4738-b7ee-9faa8180f992/error.txt +5 -0
- package/.code/agents/5f888d6f-d7ca-4ac8-be23-9ea1bf753951/error.txt +5 -0
- package/.code/agents/607db3ab-e4b0-435b-b497-93e9aa525549/error.txt +8 -0
- package/.code/agents/67dcb2a2-900f-4c78-b3fc-80b5213e0ddf/error.txt +8 -0
- package/.code/agents/69ad848c-4e98-49b3-b16c-0094ac2d1759/error.txt +5 -0
- package/.code/agents/6c9cfc5f-0d0b-445c-b121-9f60082c4f70/error.txt +1 -0
- package/.code/agents/6f6f8f77-4ab0-4f6e-9f30-40e8be0bd8f5/error.txt +1 -0
- package/.code/agents/72a7cde4-fa8a-4024-9038-27faa550539b/error.txt +1 -0
- package/.code/agents/7b48335c-8247-43aa-9949-5f820ba8e199/error.txt +1 -0
- package/.code/agents/80944249-bea9-4ac5-87de-a666c4df306e/error.txt +1 -0
- package/.code/agents/826099df-1b66-4186-a915-7eb59f9db19d/error.txt +5 -0
- package/.code/agents/8291d158-18a8-4a92-b799-4e9a4d9cce88/error.txt +1 -0
- package/.code/agents/82fb71a3-20fb-4341-804a-a2fc900f95bc/error.txt +1 -0
- package/.code/agents/855790ea-54ee-43e4-8209-a66994e37590/error.txt +1 -0
- package/.code/agents/88ce3a2e-04f2-42be-9062-bf97aa798da0/error.txt +3 -0
- package/.code/agents/9a17e398-b6ed-4218-bb55-bc64a8d38ce8/error.txt +8 -0
- package/.code/agents/9a4f4bfc-a2a6-4f40-a896-9335b41a7ed1/error.txt +1 -0
- package/.code/agents/9b633e55-ef84-47d6-94bb-fd3dd172ad97/error.txt +1 -0
- package/.code/agents/9b81f3ab-c72b-4a81-9a8f-28a49ddba84a/error.txt +8 -0
- package/.code/agents/a35daf29-b2d1-4aef-9b42-dad63a76bd47/error.txt +3 -0
- package/.code/agents/a81990cc-69ee-44d2-b907-17403c9bc5d7/error.txt +5 -0
- package/.code/agents/ab56260a-4a83-4ad4-9410-f88a23d6520a/error.txt +1 -0
- package/.code/agents/ad722c31-2d1d-45f7-bae2-3f02ca455b60/error.txt +1 -0
- package/.code/agents/b62e8690-3324-4b97-9309-731bee79416b/error.txt +5 -0
- package/.code/agents/baf60a3a-752b-4ad8-99d6-df32423ed2eb/error.txt +1 -0
- package/.code/agents/be049042-7dcb-4ac8-9beb-c8f1aea67742/error.txt +14 -0
- package/.code/agents/bed1dcb4-bfce-4a9f-8594-0f994962aafd/error.txt +1 -0
- package/.code/agents/c324a6cf-e935-4ede-9529-b3ebc18e8d6b/error.txt +5 -0
- package/.code/agents/c37c06ff-dfe3-43f2-9bbc-3ec73ec8f41d/error.txt +5 -0
- package/.code/agents/c8cd6671-433a-456b-9f88-e51cb2df6bfc/error.txt +11 -0
- package/.code/agents/ca2ccb67-2f24-428e-b27d-9365beadd140/error.txt +1 -0
- package/.code/agents/cf08c0c8-e7f0-423e-93ba-547e8e818340/error.txt +8 -0
- package/.code/agents/d579c74f-874b-40a4-9d56-ced1eb6a701d/error.txt +1 -0
- package/.code/agents/df412c98-7378-4deb-8e1e-76c416931181/error.txt +3 -0
- package/.code/agents/e5134eb3-2af4-45b0-8998-051cb4afdb45/error.txt +3 -0
- package/.code/agents/e6308471-aa45-4e9e-9496-2e9404164d97/error.txt +8 -0
- package/.code/agents/e7bd8bc7-23fb-4f46-98dc-b0dcf11b75a1/error.txt +1 -0
- package/.code/agents/e92bec35-378d-4fe1-8ac0-6e1bb3c86911/error.txt +5 -0
- package/.code/agents/ed918fbf-2dc4-4aa2-bfc5-04b65d9471ea/error.txt +1 -0
- package/.code/agents/ef1d756f-b272-48fc-8729-f05c494674f7/error.txt +1 -0
- package/.code/agents/ef359853-0249-4e41-a804-c0fc459fe456/error.txt +1 -0
- package/.code/agents/effc7b4a-4b90-40a0-8c86-a7a99d2d5fd2/error.txt +1 -0
- package/.code/agents/fa15f8d5-8359-4a8b-83a3-2f2056b3ff40/error.txt +3 -0
- package/.code/agents/fbef4193-eadf-4c8a-83ff-4878a6310f25/error.txt +8 -0
- package/.code/agents/fd0a4b4a-fda4-4964-a6d6-2b8a2da387c6/error.txt +1 -0
- package/.dxtignore +57 -0
- package/.env.example +44 -0
- package/.gemini/settings.json +8 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +41 -0
- package/.github/ISSUE_TEMPLATE/config.yml +5 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +24 -0
- package/.github/ISSUE_TEMPLATE/release_checklist.md +31 -0
- package/.github/pull_request_template.md +41 -0
- package/.github/workflows/ci-tests.yml +41 -0
- package/.github/workflows/claude-code-review.yml +57 -0
- package/.github/workflows/claude.yml +50 -0
- package/.github/workflows/full-integration.yml +22 -0
- package/.github/workflows/pr-description-check.yml +88 -0
- package/.github/workflows/publish.yml +33 -0
- package/.github/workflows/release.yml +89 -0
- package/.mcpbignore +58 -0
- package/.prettierignore +10 -0
- package/.prettierrc.json +10 -0
- package/ADOS-2-Module-1-Complete-Manual.md +757 -0
- package/AGENTS.md +36 -0
- package/CHANGELOG.md +187 -0
- package/CLAUDE.md +414 -0
- package/CODEREVIEW_RESPONSE.md +128 -0
- package/LICENSE +17 -0
- package/NUL +1 -0
- package/README.md +222 -0
- package/SCHEMA_IMPROVEMENT_SUMMARY.md +120 -0
- package/TESTING_NOTES.md +217 -0
- package/WARP.md +245 -0
- package/accountactivity-merged.csv +149 -0
- package/bin/ynab-mcp-server.cjs +4 -0
- package/bin/ynab-mcp-server.js +8 -0
- package/bundle-analysis.html +13110 -0
- package/dist/bundle/index.cjs +124 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +85 -0
- package/dist/server/YNABMCPServer.d.ts +264 -0
- package/dist/server/YNABMCPServer.js +845 -0
- package/dist/server/budgetResolver.d.ts +15 -0
- package/dist/server/budgetResolver.js +99 -0
- package/dist/server/cacheManager.d.ts +74 -0
- package/dist/server/cacheManager.js +306 -0
- package/dist/server/config.d.ts +3 -0
- package/dist/server/config.js +19 -0
- package/dist/server/deltaCache.d.ts +61 -0
- package/dist/server/deltaCache.js +206 -0
- package/dist/server/deltaCache.merge.d.ts +9 -0
- package/dist/server/deltaCache.merge.js +111 -0
- package/dist/server/diagnostics.d.ts +90 -0
- package/dist/server/diagnostics.js +163 -0
- package/dist/server/errorHandler.d.ts +69 -0
- package/dist/server/errorHandler.js +524 -0
- package/dist/server/prompts.d.ts +31 -0
- package/dist/server/prompts.js +205 -0
- package/dist/server/rateLimiter.d.ts +27 -0
- package/dist/server/rateLimiter.js +82 -0
- package/dist/server/requestLogger.d.ts +62 -0
- package/dist/server/requestLogger.js +190 -0
- package/dist/server/resources.d.ts +39 -0
- package/dist/server/resources.js +85 -0
- package/dist/server/responseFormatter.d.ts +14 -0
- package/dist/server/responseFormatter.js +42 -0
- package/dist/server/securityMiddleware.d.ts +87 -0
- package/dist/server/securityMiddleware.js +117 -0
- package/dist/server/serverKnowledgeStore.d.ts +11 -0
- package/dist/server/serverKnowledgeStore.js +42 -0
- package/dist/server/toolRegistry.d.ts +85 -0
- package/dist/server/toolRegistry.js +272 -0
- package/dist/tools/__tests__/deltaTestUtils.d.ts +18 -0
- package/dist/tools/__tests__/deltaTestUtils.js +26 -0
- package/dist/tools/accountTools.d.ts +37 -0
- package/dist/tools/accountTools.js +175 -0
- package/dist/tools/budgetTools.d.ts +10 -0
- package/dist/tools/budgetTools.js +68 -0
- package/dist/tools/categoryTools.d.ts +27 -0
- package/dist/tools/categoryTools.js +232 -0
- package/dist/tools/compareTransactions/formatter.d.ts +71 -0
- package/dist/tools/compareTransactions/formatter.js +97 -0
- package/dist/tools/compareTransactions/index.d.ts +30 -0
- package/dist/tools/compareTransactions/index.js +160 -0
- package/dist/tools/compareTransactions/matcher.d.ts +12 -0
- package/dist/tools/compareTransactions/matcher.js +140 -0
- package/dist/tools/compareTransactions/parser.d.ts +14 -0
- package/dist/tools/compareTransactions/parser.js +430 -0
- package/dist/tools/compareTransactions/types.d.ts +27 -0
- package/dist/tools/compareTransactions/types.js +1 -0
- package/dist/tools/compareTransactions.d.ts +1 -0
- package/dist/tools/compareTransactions.js +1 -0
- package/dist/tools/deltaFetcher.d.ts +22 -0
- package/dist/tools/deltaFetcher.js +137 -0
- package/dist/tools/deltaSupport.d.ts +20 -0
- package/dist/tools/deltaSupport.js +176 -0
- package/dist/tools/exportTransactions.d.ts +17 -0
- package/dist/tools/exportTransactions.js +191 -0
- package/dist/tools/monthTools.d.ts +16 -0
- package/dist/tools/monthTools.js +107 -0
- package/dist/tools/payeeTools.d.ts +17 -0
- package/dist/tools/payeeTools.js +82 -0
- package/dist/tools/reconcileAdapter.d.ts +25 -0
- package/dist/tools/reconcileAdapter.js +167 -0
- package/dist/tools/reconciliation/analyzer.d.ts +3 -0
- package/dist/tools/reconciliation/analyzer.js +567 -0
- package/dist/tools/reconciliation/executor.d.ts +94 -0
- package/dist/tools/reconciliation/executor.js +611 -0
- package/dist/tools/reconciliation/index.d.ts +54 -0
- package/dist/tools/reconciliation/index.js +249 -0
- package/dist/tools/reconciliation/matcher.d.ts +3 -0
- package/dist/tools/reconciliation/matcher.js +160 -0
- package/dist/tools/reconciliation/payeeNormalizer.d.ts +6 -0
- package/dist/tools/reconciliation/payeeNormalizer.js +77 -0
- package/dist/tools/reconciliation/recommendationEngine.d.ts +2 -0
- package/dist/tools/reconciliation/recommendationEngine.js +273 -0
- package/dist/tools/reconciliation/reportFormatter.d.ts +13 -0
- package/dist/tools/reconciliation/reportFormatter.js +214 -0
- package/dist/tools/reconciliation/types.d.ts +172 -0
- package/dist/tools/reconciliation/types.js +7 -0
- package/dist/tools/schemas/outputs/accountOutputs.d.ts +58 -0
- package/dist/tools/schemas/outputs/accountOutputs.js +24 -0
- package/dist/tools/schemas/outputs/budgetOutputs.d.ts +48 -0
- package/dist/tools/schemas/outputs/budgetOutputs.js +15 -0
- package/dist/tools/schemas/outputs/categoryOutputs.d.ts +93 -0
- package/dist/tools/schemas/outputs/categoryOutputs.js +37 -0
- package/dist/tools/schemas/outputs/comparisonOutputs.d.ts +269 -0
- package/dist/tools/schemas/outputs/comparisonOutputs.js +181 -0
- package/dist/tools/schemas/outputs/index.d.ts +14 -0
- package/dist/tools/schemas/outputs/index.js +14 -0
- package/dist/tools/schemas/outputs/monthOutputs.d.ts +122 -0
- package/dist/tools/schemas/outputs/monthOutputs.js +51 -0
- package/dist/tools/schemas/outputs/payeeOutputs.d.ts +34 -0
- package/dist/tools/schemas/outputs/payeeOutputs.js +16 -0
- package/dist/tools/schemas/outputs/reconciliationOutputs.d.ts +1275 -0
- package/dist/tools/schemas/outputs/reconciliationOutputs.js +377 -0
- package/dist/tools/schemas/outputs/transactionMutationOutputs.d.ts +717 -0
- package/dist/tools/schemas/outputs/transactionMutationOutputs.js +260 -0
- package/dist/tools/schemas/outputs/transactionOutputs.d.ts +98 -0
- package/dist/tools/schemas/outputs/transactionOutputs.js +49 -0
- package/dist/tools/schemas/outputs/utilityOutputs.d.ts +219 -0
- package/dist/tools/schemas/outputs/utilityOutputs.js +120 -0
- package/dist/tools/schemas/shared/commonOutputs.d.ts +24 -0
- package/dist/tools/schemas/shared/commonOutputs.js +27 -0
- package/dist/tools/toolCategories.d.ts +32 -0
- package/dist/tools/toolCategories.js +32 -0
- package/dist/tools/transactionTools.d.ts +315 -0
- package/dist/tools/transactionTools.js +1722 -0
- package/dist/tools/utilityTools.d.ts +10 -0
- package/dist/tools/utilityTools.js +56 -0
- package/dist/types/index.d.ts +20 -0
- package/dist/types/index.js +16 -0
- package/dist/types/toolAnnotations.d.ts +7 -0
- package/dist/types/toolAnnotations.js +1 -0
- package/dist/utils/amountUtils.d.ts +3 -0
- package/dist/utils/amountUtils.js +10 -0
- package/dist/utils/dateUtils.d.ts +9 -0
- package/dist/utils/dateUtils.js +43 -0
- package/dist/utils/money.d.ts +21 -0
- package/dist/utils/money.js +51 -0
- package/docs/README.md +72 -0
- package/docs/assets/examples/reconciliation-with-recommendations.json +68 -0
- package/docs/assets/schemas/reconciliation-v2.json +338 -0
- package/docs/getting-started/CONFIGURATION.md +175 -0
- package/docs/getting-started/INSTALLATION.md +333 -0
- package/docs/getting-started/QUICKSTART.md +282 -0
- package/docs/guides/ARCHITECTURE.md +650 -0
- package/docs/guides/DEPLOYMENT.md +189 -0
- package/docs/guides/INTEGRATION_TESTING.md +730 -0
- package/docs/guides/TESTING.md +591 -0
- package/docs/reconciliation-flow.md +83 -0
- package/docs/reference/API.md +1450 -0
- package/docs/reference/EXAMPLES.md +946 -0
- package/docs/reference/TOOLS.md +348 -0
- package/docs/reference/TROUBLESHOOTING.md +481 -0
- package/esbuild.config.mjs +68 -0
- package/eslint.config.js +49 -0
- package/fix-types.sh +17 -0
- package/meta.json +12550 -0
- package/package.json +105 -0
- package/package.json.tmp +105 -0
- package/scripts/analyze-bundle.mjs +41 -0
- package/scripts/create-pr-description.js +203 -0
- package/scripts/generate-mcpb.ps1 +96 -0
- package/scripts/run-domain-integration-tests.js +33 -0
- package/scripts/run-generate-mcpb.js +29 -0
- package/scripts/run-throttled-integration-tests.js +116 -0
- package/scripts/test-delta-params.mjs +140 -0
- package/scripts/test-recommendations.ts +53 -0
- package/scripts/tmpTransaction.ts +48 -0
- package/scripts/validate-env.js +122 -0
- package/scripts/verify-build.js +105 -0
- package/scripts/watch-and-restart.ps1 +50 -0
- package/src/__tests__/comprehensive.integration.test.ts +1196 -0
- package/src/__tests__/delta.performance.test.ts +80 -0
- package/src/__tests__/performance.test.ts +725 -0
- package/src/__tests__/setup.ts +449 -0
- package/src/__tests__/testRunner.ts +444 -0
- package/src/__tests__/testUtils.ts +563 -0
- package/src/__tests__/workflows.e2e.test.ts +1675 -0
- package/src/index.ts +124 -0
- package/src/server/.gitkeep +1 -0
- package/src/server/YNABMCPServer.ts +1188 -0
- package/src/server/__tests__/YNABMCPServer.integration.test.ts +903 -0
- package/src/server/__tests__/YNABMCPServer.test.ts +894 -0
- package/src/server/__tests__/budgetResolver.test.ts +425 -0
- package/src/server/__tests__/cacheManager.test.ts +880 -0
- package/src/server/__tests__/config.test.ts +166 -0
- package/src/server/__tests__/deltaCache.merge.test.ts +724 -0
- package/src/server/__tests__/deltaCache.swr.test.ts +168 -0
- package/src/server/__tests__/deltaCache.test.ts +774 -0
- package/src/server/__tests__/diagnostics.test.ts +823 -0
- package/src/server/__tests__/errorHandler.integration.test.ts +466 -0
- package/src/server/__tests__/errorHandler.test.ts +416 -0
- package/src/server/__tests__/prompts.test.ts +354 -0
- package/src/server/__tests__/rateLimiter.test.ts +314 -0
- package/src/server/__tests__/requestLogger.test.ts +408 -0
- package/src/server/__tests__/resources.test.ts +299 -0
- package/src/server/__tests__/security.integration.test.ts +426 -0
- package/src/server/__tests__/securityMiddleware.test.ts +449 -0
- package/src/server/__tests__/server-startup.integration.test.ts +477 -0
- package/src/server/__tests__/serverKnowledgeStore.test.ts +174 -0
- package/src/server/__tests__/toolRegistry.test.ts +855 -0
- package/src/server/budgetResolver.ts +235 -0
- package/src/server/cacheManager.ts +503 -0
- package/src/server/config.ts +41 -0
- package/src/server/deltaCache.merge.ts +149 -0
- package/src/server/deltaCache.ts +341 -0
- package/src/server/diagnostics.ts +338 -0
- package/src/server/errorHandler.ts +756 -0
- package/src/server/prompts.ts +291 -0
- package/src/server/rateLimiter.ts +156 -0
- package/src/server/requestLogger.ts +344 -0
- package/src/server/resources.ts +168 -0
- package/src/server/responseFormatter.ts +51 -0
- package/src/server/securityMiddleware.ts +236 -0
- package/src/server/serverKnowledgeStore.ts +91 -0
- package/src/server/toolRegistry.ts +489 -0
- package/src/tools/.gitkeep +1 -0
- package/src/tools/__tests__/accountTools.delta.integration.test.ts +128 -0
- package/src/tools/__tests__/accountTools.integration.test.ts +117 -0
- package/src/tools/__tests__/accountTools.test.ts +653 -0
- package/src/tools/__tests__/budgetTools.delta.integration.test.ts +90 -0
- package/src/tools/__tests__/budgetTools.integration.test.ts +134 -0
- package/src/tools/__tests__/budgetTools.test.ts +423 -0
- package/src/tools/__tests__/categoryTools.delta.integration.test.ts +80 -0
- package/src/tools/__tests__/categoryTools.integration.test.ts +295 -0
- package/src/tools/__tests__/categoryTools.test.ts +622 -0
- package/src/tools/__tests__/compareTransactions/formatter.test.ts +486 -0
- package/src/tools/__tests__/compareTransactions/index.test.ts +383 -0
- package/src/tools/__tests__/compareTransactions/matcher.test.ts +410 -0
- package/src/tools/__tests__/compareTransactions/parser.test.ts +764 -0
- package/src/tools/__tests__/compareTransactions.test.ts +342 -0
- package/src/tools/__tests__/compareTransactions.window.test.ts +147 -0
- package/src/tools/__tests__/deltaFetcher.scheduled.integration.test.ts +76 -0
- package/src/tools/__tests__/deltaFetcher.test.ts +270 -0
- package/src/tools/__tests__/deltaSupport.test.ts +188 -0
- package/src/tools/__tests__/deltaTestUtils.ts +46 -0
- package/src/tools/__tests__/exportTransactions.test.ts +213 -0
- package/src/tools/__tests__/monthTools.delta.integration.test.ts +80 -0
- package/src/tools/__tests__/monthTools.integration.test.ts +174 -0
- package/src/tools/__tests__/monthTools.test.ts +523 -0
- package/src/tools/__tests__/payeeTools.delta.integration.test.ts +80 -0
- package/src/tools/__tests__/payeeTools.integration.test.ts +150 -0
- package/src/tools/__tests__/payeeTools.test.ts +445 -0
- package/src/tools/__tests__/transactionTools.integration.test.ts +762 -0
- package/src/tools/__tests__/transactionTools.test.ts +3521 -0
- package/src/tools/__tests__/utilityTools.integration.test.ts +128 -0
- package/src/tools/__tests__/utilityTools.test.ts +205 -0
- package/src/tools/accountTools.ts +283 -0
- package/src/tools/budgetTools.ts +112 -0
- package/src/tools/categoryTools.ts +366 -0
- package/src/tools/compareTransactions/formatter.ts +163 -0
- package/src/tools/compareTransactions/index.ts +228 -0
- package/src/tools/compareTransactions/matcher.ts +240 -0
- package/src/tools/compareTransactions/parser.ts +557 -0
- package/src/tools/compareTransactions/types.ts +60 -0
- package/src/tools/compareTransactions.ts +3 -0
- package/src/tools/deltaFetcher.ts +278 -0
- package/src/tools/deltaSupport.ts +293 -0
- package/src/tools/exportTransactions.ts +273 -0
- package/src/tools/monthTools.ts +164 -0
- package/src/tools/payeeTools.ts +140 -0
- package/src/tools/reconcileAdapter.ts +312 -0
- package/src/tools/reconciliation/__tests__/adapter.causes.test.ts +122 -0
- package/src/tools/reconciliation/__tests__/adapter.test.ts +234 -0
- package/src/tools/reconciliation/__tests__/analyzer.test.ts +406 -0
- package/src/tools/reconciliation/__tests__/executor.integration.test.ts +366 -0
- package/src/tools/reconciliation/__tests__/executor.test.ts +779 -0
- package/src/tools/reconciliation/__tests__/matcher.test.ts +650 -0
- package/src/tools/reconciliation/__tests__/payeeNormalizer.test.ts +278 -0
- package/src/tools/reconciliation/__tests__/recommendationEngine.integration.test.ts +658 -0
- package/src/tools/reconciliation/__tests__/recommendationEngine.test.ts +1000 -0
- package/src/tools/reconciliation/__tests__/reconciliation.delta.integration.test.ts +151 -0
- package/src/tools/reconciliation/__tests__/reportFormatter.test.ts +573 -0
- package/src/tools/reconciliation/__tests__/scenarios/adapterCurrency.scenario.test.ts +78 -0
- package/src/tools/reconciliation/__tests__/scenarios/extremes.scenario.test.ts +47 -0
- package/src/tools/reconciliation/__tests__/scenarios/repeatAmount.scenario.test.ts +61 -0
- package/src/tools/reconciliation/__tests__/schemaUrl.test.ts +49 -0
- package/src/tools/reconciliation/analyzer.ts +824 -0
- package/src/tools/reconciliation/executor.ts +880 -0
- package/src/tools/reconciliation/index.ts +400 -0
- package/src/tools/reconciliation/matcher.ts +269 -0
- package/src/tools/reconciliation/payeeNormalizer.ts +167 -0
- package/src/tools/reconciliation/recommendationEngine.ts +506 -0
- package/src/tools/reconciliation/reportFormatter.ts +363 -0
- package/src/tools/reconciliation/types.ts +314 -0
- package/src/tools/schemas/outputs/__tests__/accountOutputs.test.ts +424 -0
- package/src/tools/schemas/outputs/__tests__/budgetOutputs.test.ts +310 -0
- package/src/tools/schemas/outputs/__tests__/categoryOutputs.test.ts +448 -0
- package/src/tools/schemas/outputs/__tests__/comparisonOutputs.test.ts +519 -0
- package/src/tools/schemas/outputs/__tests__/dateValidation.test.ts +155 -0
- package/src/tools/schemas/outputs/__tests__/discrepancyDirection.test.ts +288 -0
- package/src/tools/schemas/outputs/__tests__/monthOutputs.test.ts +478 -0
- package/src/tools/schemas/outputs/__tests__/payeeOutputs.test.ts +370 -0
- package/src/tools/schemas/outputs/__tests__/reconciliationOutputs.test.ts +401 -0
- package/src/tools/schemas/outputs/__tests__/transactionMutationSchemas.test.ts +213 -0
- package/src/tools/schemas/outputs/__tests__/transactionOutputs.test.ts +474 -0
- package/src/tools/schemas/outputs/__tests__/utilityOutputs.test.ts +333 -0
- package/src/tools/schemas/outputs/accountOutputs.ts +137 -0
- package/src/tools/schemas/outputs/budgetOutputs.ts +86 -0
- package/src/tools/schemas/outputs/categoryOutputs.ts +194 -0
- package/src/tools/schemas/outputs/comparisonOutputs.ts +600 -0
- package/src/tools/schemas/outputs/index.ts +270 -0
- package/src/tools/schemas/outputs/monthOutputs.ts +243 -0
- package/src/tools/schemas/outputs/payeeOutputs.ts +105 -0
- package/src/tools/schemas/outputs/reconciliationOutputs.ts +796 -0
- package/src/tools/schemas/outputs/transactionMutationOutputs.ts +758 -0
- package/src/tools/schemas/outputs/transactionOutputs.ts +243 -0
- package/src/tools/schemas/outputs/utilityOutputs.ts +411 -0
- package/src/tools/schemas/shared/commonOutputs.ts +140 -0
- package/src/tools/toolCategories.ts +140 -0
- package/src/tools/transactionTools.ts +2509 -0
- package/src/tools/utilityTools.ts +90 -0
- package/src/types/.gitkeep +1 -0
- package/src/types/__tests__/index.test.ts +52 -0
- package/src/types/index.ts +67 -0
- package/src/types/integration-tests.d.ts +35 -0
- package/src/types/toolAnnotations.ts +44 -0
- package/src/utils/__tests__/dateUtils.test.ts +170 -0
- package/src/utils/__tests__/money.test.ts +189 -0
- package/src/utils/amountUtils.ts +32 -0
- package/src/utils/dateUtils.ts +108 -0
- package/src/utils/money.ts +123 -0
- package/test-csv-sample.csv +28 -0
- package/test-exports/sample_bank_statement.csv +7 -0
- package/test-exports/ynab_account_e9ddc2a6_minimal_1items_2025-11-19_09-04-53.json +23 -0
- package/test-exports/ynab_account_e9ddc2a6_minimal_1items_2025-11-19_10-37-42.json +23 -0
- package/test-exports/ynab_account_e9ddc2a6_minimal_4items_2025-11-19_09-02-09.json +44 -0
- package/test-exports/ynab_account_e9ddc2a6_minimal_6items_2025-11-19_10-37-52.json +58 -0
- package/test-exports/ynab_since_2025-11-01_account_4c18e9f0_minimal_14items_2025-11-16_10-07-10.json +115 -0
- package/test-reconcile-autodetect.js +40 -0
- package/test-reconcile-tool.js +152 -0
- package/test-reconcile-with-csv.cjs +89 -0
- package/test-statement.csv +8 -0
- package/test_debug.js +47 -0
- package/test_simple.mjs +16 -0
- package/tsconfig.json +31 -0
- package/tsconfig.prod.json +18 -0
- package/vitest-reporters/split-json-reporter.ts +211 -0
- 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,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
|
+
}
|
package/test-exports/ynab_since_2025-11-01_account_4c18e9f0_minimal_14items_2025-11-16_10-07-10.json
ADDED
|
@@ -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
|
+
}
|