Catch up to latest changes#84
Merged
code-with-jov merged 27 commits intoopsx_pp_13_99from Mar 14, 2026
Merged
Conversation
* [AI] Extract PR/commit rules into shared agent skill Deduplicate PR and commit instructions from AGENTS.md into a standalone skill file at .github/agents/pr-and-commit-rules.md. This single source of truth is consumed by both Claude Code (via CLAUDE.md @-import) and Cursor (via .cursor/rules/pr-and-commit.mdc with alwaysApply: true). AGENTS.md now references the shared file instead of repeating the rules in three separate sections. https://claude.ai/code/session_01KkHg7MYXrTyDkTw6u98Vam * Add release notes for PR actualbudget#7153 --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…lbudget#7041) * refactor(usePreviewTransactions): Move running balances to useMemo * docs(relnotes): Add note for mobile running balance fix * refactor(hooks): Remove unnecessary options ref
* Move migrations script to typescript * Add release notes * Setup * Fix * PR feedback * Make imports work as expected * Rabbit
…budget#7125) * Add failing tests for SimpleFin batch sync shared error array bug Tests prove two bugs in simpleFinBatchSync() catch block (app.ts:1100-1115): 1. All accounts share the same errors array reference 2. Errors accumulate across accounts instead of being isolated Related: actualbudget#6623, actualbudget#6651, actualbudget#7114 https://claude.ai/code/session_011ebiiXRMmbiKxYMohVXL6o * Fix shared error array in SimpleFin batch sync catch block When simpleFinBatchSync() threw an error, all accounts received the same errors array by reference and errors accumulated across accounts. Each account now gets its own isolated errors array with a single error specific to that account, matching the pattern used by accountsBankSync(). Fixes actualbudget#6623 https://claude.ai/code/session_011ebiiXRMmbiKxYMohVXL6o * Remove @ts-strict-ignore from bank sync tests Use proper non-null assertions instead of disabling strict mode. https://claude.ai/code/session_011ebiiXRMmbiKxYMohVXL6o * Add release notes for PR actualbudget#7125 * [AI] Replace test() with it() to follow repo convention Co-authored-by: Matiss Janis Aboltins <MatissJanis@users.noreply.github.com> --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Matiss Janis Aboltins <MatissJanis@users.noreply.github.com>
* Phase 1: Add payee locations database schema/types * Add migration to create payee_locations table with proper indexes * Add PayeeLocationEntity type definition * Update database schema to include payee_locations table * Export PayeeLocationEntity from models index * Phase 2: Add payee location API/services * Add constants for default location behavior * Implement location service with geolocation adapters * Add new API handlers for payee location operations * Phase 3: Add location-aware UI components/hooks * Update mobile transaction editing with location integration * Enhance PayeeAutocomplete with nearby payee suggestions and forget functionality * Implement location permission and placeholder unit of measurement hooks * Phase 4: Add YNAB5 payee location import support * Extend YNAB5 types to include location data from payees * Implement location import logic in YNAB5 importer * Phase 5: Add unit of measurement support * Add unit of measurement preference setting in Format.tsx * Implement distance formatting utilities for imperial/metric units * Add useUnitOfMeasurementFormat hook for accessing preferences * Required release note about the PR * Update VRT screenshots Auto-generated by VRT workflow PR: actualbudget#6157 * Actually get syncing working This was not obvious to me, esp. with 13 years of data, but the locations I've been inserting were local only. Everything appeared to work. What I failed to notice is that the locations did not sync across devices. Of course all the location data that was imported worked fine, but nothing new unless it was created on device. This changes the schema and uses the proper insert/delete methods such that syncing works. * Remove unit of measurement preference Display feet and meters automatically, and don't bother to format based on miles/kilometers. * Add payeeLocations feature flag Place the location permissions check and thus user-facing functionality behind the feature flag * Missed adding tombstone to payee location query * Adjust migration name to pass CI Adjust the indexes as well * Unify location.ts If CodeRabbit complains again, reply that we are actively choosing a unified file * Add bounds testing The validation is straightforward range-checking — if it's wrong, it'll be obvious quickly. Unless there's a plan to start adding broader test coverage for that file, I'd leave it untested for now * Prefer camelCase for the method params * Fix the nested interactive containers * Fix the majority of CodeRabbit nits The remainder seem to not be related to my code change (just a lint), outdated (sql migration comment), or infeasible (sql haversine query) * More CodeRabbit nits * Revert unnecessary YNAB5 zip import Turns out the payee_locations were inside the exported budget all along! * Additional guards and other CR fixes * Match the pattern used elsewhere in file * YNAB5.Budget -> Budget Missed in the merge conflict * ci: trigger rerun * Change import from fetch to connection module * Correct invalid border property Ah. I never noticed this property wasn't working. I guess the button looked OK to me! * Only hide the button on success * Update packages/loot-core/src/shared/location-utils.ts Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv> * Update packages/loot-core/src/server/payees/app.ts Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv> * Fully fix typo Guess I shouldn't commit a suggestion after waking up * Attempting to address feedback Manual select nearby payee and save payee location buttons to make the UX more obvi * Remove stale file that was moved * Additional cleanup of remnant change Removed the references to location from a few existing entities * Additional cleanup of remnant change * Show the Nearby payees button even when the field is disabled If there are nearby payees, there's not a payee already selected, and the save button isn't needed * runQuery is not async * Add mockNearbyPayeesResult to test Trying to utilize the real type in the mock --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Matiss Janis Aboltins <matiss@mja.lv>
…LoginMethod (actualbudget#7155) * [AI] Fix privilege escalation in sync-server /change-password and getLoginMethod Made-with: Cursor * Update upcoming-release-notes/7155.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Fix privilege escalation issue in change-password endpoint --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* Update customThemeCatalog.json Added custom theme inspired by Notion's Dark Mode * [autofix.ci] apply automated fixes * Create 7151.md release notes file * Add Notion Dark Mode custom theme Pushed a no-op change to get the tests to re-run --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* [AI] Refactor modal components and server modules Made-with: Cursor * Release notes
* fix item selection requiring double tap on mobile * Update upcoming-release-notes/7166.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * extract getItemProps wrapper --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* Add "only import transactions since" If specified, we filter out transactions before the given date. * Address 🐰 comments * Update VRT screenshots Auto-generated by VRT workflow PR: actualbudget#7139 --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…actualbudget#7101) * Add swap payee-memo to ofx import * Add mock files to test payee-memo swap * Add swap payee-memo to qif import * Add swap payee-memo to camt import * Minor code cleanup for swap payee-memo on import * Add release note * lint fixing * Fixe Payee and Memo capitalization * change swapPayeeAndMemo to ofxSwapPayeeAndMemo * correct release note typo * Add getSwapOption base on file type * Support qfx * Add CheckboxToggle to simplify ImportTransactionsModal options * Fix split reac import * Fix react import lint
* Update Titlebar.tsx sync name to Server Sync * Update Titlebar.tsx * Create 7005.md Change title Bar 'Sync' to 'Server Sync'. * Update packages/desktop-client/src/components/Titlebar.tsx Co-authored-by: Joel Jeremy Marquez <joeljeremy.marquez@gmail.com> * Update packages/desktop-client/src/components/Titlebar.tsx Co-authored-by: Joel Jeremy Marquez <joeljeremy.marquez@gmail.com> * Update Titlebar.tsx * Update Titlebar.tsx * Update Titlebar.tsx * [autofix.ci] apply automated fixes * Update 7005.md * Disable Server Sync button when offline in Titlebar component * fix lint * Add aria-disabled attribute to Server Sync button in Titlebar component * Update titlebar sync icon and improve accessibility Add disabled state and aria disabled label for offline mode. --------- Co-authored-by: Joel Jeremy Marquez <joeljeremy.marquez@gmail.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: youngcw <calebyoung94@gmail.com>
…ualbudget#7145) * [AI] Consolidate custom theme prefs and improve auto-mode UX - Merge `installedCustomTheme` into `installedCustomLightTheme` so only two prefs exist (light + dark). The legacy asyncStorage key `installed-custom-theme` is preserved for backwards compatibility. - In auto (System default) mode, the main Theme dropdown no longer surfaces the installed custom-light theme as an option; custom themes for light/dark are managed exclusively via the sub-selectors. - Selecting "System default" resets both light and dark custom themes. - Installing a custom theme from the main dropdown while in auto mode switches the base theme to "Light" so it applies directly. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Add release notes for PR actualbudget#7145 * Change category from Features to Enhancement Custom Themes: separate light and dark theme options when selecting 'system default' theme. * Update VRT screenshots Auto-generated by VRT workflow PR: actualbudget#7145 * Enhance ThemeSettings and UI components by adding maxWidth styling for better responsiveness. This change ensures that buttons and columns adapt to the full width of their containers. --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
* [AI] Fix SimpleFin batch sync crash when accounts are missing from response When SimpleFin doesn't return data for all requested accounts during batch sync, the code crashed with a TypeError accessing properties on undefined, resulting in a generic "internal error" message for users. This fix: - Adds a guard in simpleFinBatchSync for missing account data, returning an ACCOUNT_MISSING error instead of crashing - Propagates error entries from the SimpleFin response's errors map for accounts that have no data entry - Adds a user-friendly ACCOUNT_MISSING error message in the UI suggesting to unlink and relink the account - Adds test cases covering both scenarios https://claude.ai/code/session_01XbHgxxrXYR3UTyW6VmYj47 * Add release notes for PR actualbudget#7152 * [AI] Fix SimpleFIN batch sync error_code TypeError Fix "Cannot read properties of undefined (reading 'error_code')" that occurs during SimpleFIN batch sync by: 1. Adding null check for downloadSimpleFinTransactions result in simpleFinBatchSync (sync.ts) - the function can return undefined when user token is missing 2. Adding .catch() handler on individual processBankSyncDownload promises so a single account failure doesn't crash the entire batch via Promise.all rejection 3. Using optional chaining on syncResponse.res?.error_code in app.ts and handling the case where res is undefined with proper error reporting https://claude.ai/code/session_01XbHgxxrXYR3UTyW6VmYj47 * [AI] Fix SimpleFin batch sync to emit ACCOUNT_MISSING for empty payloads In the batch sync path, if a per-account download payload is an empty object or is missing the transactions array, processBankSyncDownload would crash and the error would be caught as INTERNAL_ERROR. Now we check for these cases explicitly and emit ACCOUNT_MISSING instead, while still allowing entries with error_code to propagate their specific error. https://claude.ai/code/session_01XbHgxxrXYR3UTyW6VmYj47 --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
* [AI] docs(api): fix API reference discrepancies in reference.md Amp-Thread-ID: https://ampcode.com/threads/T-019ca316-33e2-75db-a333-baf62bb55f6c * [autofix.ci] apply automated fixes * docs: update API reference for init and updateRule methods * docs(7096.md): add release notes for API reference documentation fix --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* refactor(api): defineConfig vitest, api-helpers, drop vite.api build - Wrap api vitest.config with defineConfig for typing/IDE - Add loot-core api-helpers, use in YNAB4/YNAB5 importers - Remove vite.api.config, build-api, injected.js; simplify api package * refactor(api): update package structure and build scripts - Change main entry point and types definition paths in package.json to reflect new structure. - Simplify build script by removing migration and default database copy commands. - Adjust tsconfig.dist.json to maintain declaration directory. - Add typings for external modules in a new typings.ts file. - Update comments in schedules.ts to improve clarity and maintainability. * chore(api): update dependencies and build configuration - Replace tsc-alias with rollup-plugin-visualizer in package.json. - Update build script to use vite for building the API package. - Add vite configuration file for improved build process and visualization. - Adjust tsconfig.dist.json to exclude additional configuration files from the build. * fix(api): update visualizer output path in vite configuration - Change the output filename for the visualizer plugin from 'dist/stats.json' to 'app/stats.json' to align with the new directory structure. * refactor(api): streamline Vite configuration and remove vitest.config.ts - Remove vitest.config.ts as its configuration is now integrated into vite.config.ts. - Update vite.config.ts to include sourcemap generation and adjust CRDT path resolution. - Modify vitest.setup.ts to correct the import path for the CRDT proto file. * feat(api): enhance build scripts and add file system utilities - Update build scripts in package.json to include separate commands for building node, migrations, and default database. - Introduce a new file system utility module in loot-core to handle file operations such as reading, writing, and directory management. - Implement error handling and logging for file operations to improve robustness. * Refactor typecheck script in api package and enhance api-helpers with new schedule and rule update functions. The typecheck command was simplified by removing the strict check, and new API methods for creating schedules and updating rules were added to improve functionality. * Refactor API integration in loot-core by removing api-helpers and directly invoking handlers. Update typecheck script in api package to include strict checks, and refine TypeScript configurations across multiple packages for improved type safety and build processes. * Refactor imports and enhance code readability across multiple files in loot-core. Simplified import statements in the API and adjusted formatting in YNAB importers for consistency. Updated type annotations to improve type safety and maintainability. * Refactor handler invocation in YNAB importers to use the new send function from main-app. This change improves code consistency and readability by standardizing the method of invoking handlers across different modules. * Refactor schedule configuration in loot-core to enhance type safety by introducing a new ScheduleRuleOptions type. This change improves the clarity of the recurring schedule configuration and ensures better type checking for frequency and interval properties. * Update TypeScript configuration in api package to include path mapping for loot-core. This change enhances module resolution and improves type safety by allowing direct imports from the loot-core source directory. * Update TypeScript configuration in api package to reposition the typescript-strict-plugin entry. This change improves the organization of the tsconfig.json file while maintaining the existing path mapping for loot-core, ensuring consistent type checking across the project. * Update TypeScript configurations across multiple packages to enable noEmit option. This change enhances build processes by preventing unnecessary output files during compilation. Additionally, remove the obsolete tsconfig.api.json file from loot-core to streamline project structure. * Update TypeScript configuration in sync-server package to enable noEmit option. This change allows for the generation of output files during compilation, facilitating the build process. * Update api package configuration to streamline build process and enhance type safety. Removed unnecessary build scripts, integrated vite-plugin-dts for type declaration generation, and added migration and default database copying functionality. Adjusted vitest setup to comment out CRDT proto file import for improved test isolation. * Update TypeScript configurations in desktop-client and desktop-electron packages to enable noEmit option, allowing for output file generation during compilation. Additionally, add ts-strict-ignore comments in YNAB importers to suppress strict type checking, improving compatibility with embedded API usage. * Refactor api package configuration to update type declaration paths and enhance build process. Changed type definitions reference in package.json, streamlined tsconfig.json exclusions, and added functionality to copy inlined types during the build. Removed obsolete vitest setup file for improved test isolation. * Revert to solution without types * Update TypeScript configuration in API package to use ES2022 module and bundler resolution. This change enhances compatibility with modern JavaScript features and improves the build process. * Update yarn.lock and API package to enhance TypeScript build process and add new dependencies * Refactor inline-loot-core-types script to streamline TypeScript declaration handling and improve output organization. Remove legacy code and directly copy loot-core declaration tree, updating index.d.ts to reference local imports. * Add internal export to API and enhance Vite configuration for migration handling * Update Vite configuration in API package to target Node 18, enhancing compatibility with the latest Node features. * Enhance inline-loot-core-types script to improve TypeScript declaration handling by separating source and typings directories. Update the copy process to include emitted typings, ensuring no declarations are dropped and maintaining better organization of loot-core types. * Enhance migration handling by allowing both .sql and .js files to be copied during the migration process. Refactor file system operations in loot-core to improve error handling and streamline file management, including new methods for reading, writing, and removing files and directories. * Refactor rootPath determination in Electron file system module by removing legacy case for 'bundle.api.js'. This simplifies the path management for the Electron app. * Update API tests to mock file system paths for migration handling and change Vite configuration to target Node 20 for improved compatibility. * Add promise-retry dependency to loot-core package and update yarn.lock * Fix lint * Refactor build script order in package.json for improved execution flow * Feedback: API changes for "internal"
…error and fix violations (actualbudget#7168) * lint: promote no-floating-promises and require-array-sort-compare to error and fix violations - Set typescript/no-floating-promises and typescript/require-array-sort-compare to error in .oxlintrc.json - Add explicit compare functions to all .sort() calls: migrations (localeCompare), crdt/merkle (localeCompare), FiltersMenu (tuple key), useScheduleEdit (two-arg comparator), exec.test (localeCompare), goal-template and category-template-context (numeric), main.test and transactions.test (localeCompare / amount+id) - Fix invalid single-arg sort in useScheduleEdit to proper two-arg comparator Made-with: Cursor * refactor: update sorting functions to use two-argument comparator * Update index.ts --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Matiss Janis Aboltins <MatissJanis@users.noreply.github.com>
* [AI] Separate lint and format into distinct commands Co-authored-by: Cursor <cursoragent@cursor.com> * Update lint-staged configuration to use 'oxfmt' for formatting instead of 'yarn format:fix' * [AI] Add format checks to CI workflows Co-authored-by: Matiss Janis Aboltins <MatissJanis@users.noreply.github.com> * Refactor linting and formatting commands in package.json and GitHub workflows to streamline processes and add quiet mode for linting --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Matiss Janis Aboltins <MatissJanis@users.noreply.github.com>
…t#7180) * [AI] Fix duplicate typechecking by consolidating into lage Previously `yarn typecheck` ran: 1. `tsc -b` (type-checks all packages via project references) 2. `tsc -p tsconfig.root.json --noEmit` (checks root bin/*.ts) 3. `lage typecheck` (runs `tsc --noEmit` per package - duplicate!) Now it runs: 1. `tsc -p tsconfig.root.json --noEmit` (checks root bin/*.ts) 2. `lage typecheck` (handles everything via dependency ordering) Changes: - Remove `tsc -b` from root typecheck script - Add `dependsOn: ["^typecheck"]` to lage config for correct ordering - Change per-package typecheck from `tsc --noEmit` to `tsc -b` so declarations are emitted for dependent packages https://claude.ai/code/session_01P7mtAHphD6f1FsnQRwWBaW * Add release notes for PR actualbudget#7180 --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…ualbudget#7179) * Normalize apostrophe-dot thousandsSeparator for consistency * Also normalize keyboard apostrophes on the input path
* Bump ajv from 6.12.6 to 6.14.0 Bumps [ajv](https://github.com/ajv-validator/ajv) from 6.12.6 to 6.14.0. - [Release notes](https://github.com/ajv-validator/ajv/releases) - [Commits](ajv-validator/ajv@v6.12.6...v6.14.0) --- updated-dependencies: - dependency-name: ajv dependency-version: 6.14.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> * note --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
When filtering for accounts in e.g. the net worth graph the modal closes the filter the tooltip so it's impossible to add e.g. accounts to the filter.
* Remove `deep-equal` package * Add release notes * Add a few more tests * Add release notes
* [AI] Promote typescript/restrict-template-expressions to error and fix violations Convert the oxlint rule from "warn" to "error" and fix all 42 violations by wrapping non-string template expressions with String(). This ensures type safety in template literals across the codebase. https://claude.ai/code/session_01Uk8SwFbD6HuUuo3SSMwU9z * Add release notes for PR actualbudget#7181 --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…ctualbudget#7193) * [AI] Promote typescript/no-for-in-array lint rule from warn to error Convert the oxlint rule from "warn" to "error" as noted by the existing TODO comment, and fix the three violations by replacing for-in loops with for-of using .entries(). https://claude.ai/code/session_01N6F8DMzUVDxNJC56jMGknf * Add release notes for PR actualbudget#7193 --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Related issue(s)
Testing
Checklist