42e7ae677a
fix(exports): align CSV roundtrip contracts ( #1725 )
...
* fix(exports): align CSV roundtrip contracts
* fix(exports): version CSV export contract
* fix(exports): stabilize CSV export values
* fix(imports): preserve legacy CSV roundtrip contracts
* fix(imports): escape pipe characters in CSV tags
---------
Signed-off-by: Juan José Mata <juanjo.mata@gmail.com >
Co-authored-by: Juan José Mata <juanjo.mata@gmail.com >
2026-05-13 20:07:00 +02:00
95f6451b39
feat(sync): add Brex provider connections ( #1752 )
...
* feat(sync): add Brex provider schema
Adds Brex item and account tables with per-family credentials, scoped upstream account uniqueness, encrypted token storage, and sanitized provider payload columns.
* feat(sync): add Brex provider core
Adds Brex item/account models, provider client and adapter support, family connection helpers, and provider enum registration for read-only Brex cash and card data.
* feat(sync): add Brex import pipeline
Adds Brex account discovery, linked-account sync, cash/card balance processors, transaction import, sanitized metadata handling, and idempotent provider entry processing.
* feat(sync): add Brex connection flows
Adds Mercury-style Brex connection management, explicit item-scoped account selection and linking, settings provider UI, account index visibility, localized copy, and per-item cache handling.
* test(sync): cover Brex provider workflows
Adds targeted coverage for Brex provider requests, adapter config, item/account guards, importer behavior, entry processing, and Mercury-style controller flows.
* fix(sync): align Brex API edge cases
Tightens Brex account fetching against the official card-account response shape, sends transaction start filters as RFC3339 date-times, and keeps provider error bodies out of user-facing messages while expanding provider client guard coverage.
* fix(sync): harden Brex provider integration
Restrict Brex API base URLs to official hosts, tighten account-selection UI behavior, and add tests for invalid credentials, cache scoping, and provider setup edge cases.
* test(sync): avoid Brex secret-shaped fixtures
* refactor(sync): extract Brex account flows
* fix(sync): address Brex provider review feedback
* fix(sync): address Brex review follow-ups
Move remaining Brex review cleanup into focused model behavior, tighten link/setup edge cases, localize summaries, and add regression coverage from CodeRabbit feedback.
Also records the security-review pass as no-findings after diff-scoped inspection and Brakeman validation.
* refactor(sync): split Brex account flow controllers
Route Brex account selection and setup actions through small namespaced controllers while keeping existing URLs and helpers stable.
Business flow remains in BrexItem::AccountFlow; the main Brex item controller now only handles connection CRUD, provider-panel rendering, destroy, and sync.
* fix(sync): address Brex CodeRabbit review
* fix(sync): address Brex follow-up review
* fix(sync): address Brex review follow-ups
* fix(sync): address Brex sync review findings
* fix(sync): polish Brex review copy and errors
* fix(sync): register Brex provider health
* fix(sync): polish Brex bank sync presentation
* fix(sync): address Brex review follow-ups
* fix(sync): tighten Brex setup params
* test(api): stabilize usage rate-limit window
* fix(sync): polish Brex setup flow nits
* fix(sync): harden Brex setup params
* fix(sync): finalize Brex review cleanup
---------
Signed-off-by: Juan José Mata <juanjo.mata@gmail.com >
Co-authored-by: Juan José Mata <juanjo.mata@gmail.com >
2026-05-13 18:13:48 +02:00
ghost and GitHub
0ab3b0b698
feat(exports): add rule operand references ( #1726 )
...
* feat(exports): add rule operand references
* fix(exports): preserve rule operand references
* refactor(exports): simplify rule operand branches
* refactor(validation): centralize UUID format checks
* fix(imports): preserve false rule operands
2026-05-12 21:29:29 +02:00
ghost and GitHub
c1678181f0
fix(imports): import raw balance records ( #1724 )
...
* fix(imports): import raw balance records
* fix(imports): preserve partial balance components
2026-05-12 00:41:05 +02:00
ghost and GitHub
be598aecf0
feat(providers): add Kraken exchange sync ( #1759 )
...
* feat(providers): add Kraken exchange sync
Adds family-scoped Kraken API-key connections, read-only balance and trade import, account setup/linking flows, provider status wiring, and focused test coverage.
Closes #1758
* test(providers): avoid Kraken sample secret false positive
* fix(providers): address Kraken review findings
* fix(providers): address Kraken review cleanup
* test(imports): stabilize transaction import ordering
2026-05-12 00:22:37 +02:00
ghost and GitHub
325084e342
fix(api): include disabled-account transaction history ( #1723 )
...
* fix(api): include disabled-account transaction history
* fix(api): hide pending deletion transaction history
2026-05-12 00:14:13 +02:00
ghost and GitHub
9e6fbc1374
test(recurring): prove export roundtrip semantics ( #1727 )
...
* test(recurring): prove export roundtrip semantics
* test(recurring): assert export roundtrip payload
2026-05-12 00:02:15 +02:00
ghost and GitHub
1fedc43f68
feat(api): add import preflight validation ( #1755 )
...
* feat(api): add import preflight validation
* fix(api): harden import preflight validation
2026-05-12 00:00:49 +02:00
ghost and GitHub
6b6c3bd343
feat(exports): add attachment manifest ( #1728 )
...
* feat(exports): add attachment manifest
* fix(exports): include split parent receipts in manifest
2026-05-11 23:47:36 +02:00
ghost and GitHub
974f55e2d5
feat(api): add transaction idempotency keys ( #1729 )
...
* feat(api): add transaction idempotency keys
* fix(api): validate transaction idempotency source
* fix(api): tighten transaction idempotency params
2026-05-11 23:13:24 +02:00
ghost and GitHub
8abecf8a8d
feat(exports): preserve transfer decisions ( #1639 )
...
* feat(exports): preserve transfer decisions
* fix(api): apply transfer date filters to both sides
* fix(api): refine transfer decision handling
* fix(api): align transfer decision schemas
* fix(api): use current context for transfer filters
* fix(api): include either side in transfer date filters
* fix(api): deduplicate transfer decision filters
* fix(api): guard transfer decision exports
2026-05-08 23:03:57 +02:00
ghost and GitHub
45c5284148
feat(api): expose provider connection health ( #1636 )
...
* feat(api): expose provider connection health
* fix(api): harden provider health review paths
* fix(api): refine provider health responses
* test(api): align provider health docs key scope
* fix(api): clarify provider connection status
* fix(api): batch provider connection sync status
* fix(api): polish provider connection status review feedback
* fix(api): correct provider connection summaries
2026-05-07 00:42:32 +02:00
ghost and GitHub
9e369831ce
feat(api): expose sync status ( #1635 )
...
* feat(api): expose sync status
* fix(api): harden sync status review paths
* fix(api): address sync status review
* fix(api): tighten sync status review fixes
* fix(api): address sync status review
* test(api): avoid secret-like sync fixture key
* test(api): reuse sync status fixture key
* fix(api): align sync route helpers
* fix(api): tighten sync status scoping
* fix(api): make sync status schema nullable-compliant
2026-05-06 22:02:21 +02:00
ghost and GitHub
2d38cfb011
feat(api): expose budget state ( #1640 )
...
* feat(api): expose budget state
* fix(api): guard malformed budget ids
* fix(api): address budget state review
* fix(api): address budget state review
* fix(api): document budget id formats
* fix(api): align budget category docs auth
* fix(api): lighten budget category index payload
* fix(api): use shared pagination clamp
* fix(api): centralize budget filter handling
2026-05-06 20:50:46 +02:00
ghost and GitHub
41339b0494
feat(api): expose balance history ( #1641 )
...
* feat(api): expose balance history
* fix(api): address balance history review
* fix(api): address balance history review
* fix(api): tighten balance history docs
* fix(exports): preserve balance chronology
* fix(api): guard nullable balance account type
* test(api): align balances api key helper
* fix(api): use shared pagination clamp
* test(export): set explicit balance flows factor
2026-05-05 19:09:36 +02:00
ghost and GitHub
d0883f9018
fix(auth): hash MFA backup codes ( #1629 )
...
* fix(auth): hash MFA backup codes
* fix(auth): lock and filter backup code verification
* test(auth): assert consumed backup code digest
* fix(auth): strengthen backup code handling
* fix(auth): require otp secret before mfa enable
* test(auth): assert backup code digest consumption
* fix(auth): rehash legacy MFA backup codes
* fix(auth): narrow legacy backup code migration
2026-05-05 01:20:57 +02:00
ghost and GitHub
1ec8bd90b7
feat(api): expose import row diagnostics ( #1644 )
...
* feat(api): expose import row diagnostics
* fix(api): stabilize import row diagnostics
* fix(api): harden import row diagnostics
* fix(api): number Mint import diagnostics rows
* fix(api): enforce unique import row diagnostics
* fix(api): address import row diagnostics review
2026-05-05 01:12:48 +02:00
ghost and GitHub
a48f264799
feat(api): expose securities and price history ( #1642 )
...
* feat(api): expose securities and prices
* fix(api): stabilize security price filters
* fix(api): cap security pagination limits
* fix(api): preserve security price decimal scale
* fix(api): validate securities boolean filters
* fix(api): reject blank securities boolean filters
* fix(api): trim security exchange filter
* fix(api): tighten security price filters
* fix(api): tighten security resource filters
* fix(api): tighten securities docs fixtures
2026-05-05 01:08:43 +02:00
ghost and GitHub
a108e6501e
feat(exports): include holding snapshots ( #1643 )
...
* feat(exports): include holding snapshots
* fix(exports): resolve holding securities without mic
* fix(exports): harden holding snapshot imports
* fix(exports): harden holding snapshot upserts
* fix(exports): keep holding upserts database-driven
2026-05-05 00:44:29 +02:00
ghost and GitHub
05ef8bd9e7
feat(api): support idempotent valuation writes ( #1637 )
...
* feat(api): support idempotent valuation writes
* fix(api): clarify valuation upsert status
* docs(api): document nested valuation upserts
* docs(api): clarify valuation upsert semantics
* docs(api): clarify valuation upsert signaling
2026-05-04 18:51:48 +02:00
ghost and GitHub
98df770547
feat(exports): preserve recurring transactions ( #1638 )
...
* feat(exports): preserve recurring transactions
* fix(exports): harden recurring import records
2026-05-04 01:04:06 +02:00
9cb3b8e05c
feat(api): expose rule run history ( #1646 )
...
* feat(api): expose rule run history
* fix(api): address rule run review
* fix(api): complete rule run review
* test(api): cover unauthenticated rule run show
* test(api): align rule run api key helper
* Small Sonnet nit-pick
---------
Co-authored-by: Juan José Mata <jjmata@jjmata.com >
2026-05-03 23:33:35 +02:00
ghost and GitHub
e93b1f1fd7
feat(api): expose family settings ( #1645 )
...
* feat(api): expose family settings
* test(api): assert family settings moniker
* test(api): align family settings api key helper
* fix(api): tighten family settings schema
2026-05-03 23:10:46 +02:00
ghost and GitHub
911aa34ba9
feat(auth): add WebAuthn MFA credentials ( #1628 )
...
* feat(auth): add WebAuthn MFA credentials
* fix(auth): harden WebAuthn MFA review paths
* fix(auth): polish WebAuthn error handling
* fix(auth): handle duplicate WebAuthn credential races
* fix(auth): permit WebAuthn credential params
* fix(auth): trim WebAuthn registration controller cleanup
* fix(auth): tighten WebAuthn MFA handling
* fix(auth): pin WebAuthn relying party config
2026-05-03 22:13:28 +02:00
ghost and GitHub
50936000e7
feat(api): expose family exports ( #1632 )
...
* feat(api): expose family exports
* fix(api): harden family export review paths
* fix(api): tighten family export review paths
* fix(api): reject invalid family export params
* fix(api): address family export review
* fix(api): share uuid guard for exports
2026-05-03 11:29:29 +02:00
ghost and GitHub
6c84fc760e
fix(mercury): support named multiple API connections ( #1627 )
...
* fix(mercury): support named multiple connections
* fix(mercury): address multi-connection review feedback
* fix(mercury): localize connection labels
* fix(mercury): strip API tokens before provider calls
* test(mercury): localize provider config assertions
* fix(mercury): address multi-connection review
* refactor(mercury): simplify connection selection failure
2026-05-03 10:56:31 +02:00
ghost and GitHub
a8425a2488
feat(api): expose reset status polling ( #1598 )
...
* feat(api): expose reset status polling
* fix(api): hide reset enqueue exception details
* fix(api): use stable reset authorization message
* fix(api): narrow reset enqueue error handling
* fix(api): document reset enqueue failures
* docs(api): regenerate reset status OpenAPI
* fix(api): address reset polling review feedback
2026-05-02 22:56:42 +02:00
ghost and GitHub
c4414c4fbb
feat(api): expose import status details ( #1599 )
...
* feat(api): expose import status details
* fix(api): reuse import status validation counts
* fix(api): cache Sure import status reads
* fix(imports): invalidate cached Sure import blobs
* docs(api): split import status schemas
* fix(api): refine import status detail contract
2026-05-01 22:59:32 +02:00
ghost and GitHub
da42423475
feat(api): accept Sure NDJSON imports ( #1601 )
...
* feat(api): accept Sure NDJSON imports
* fix(api): preserve uploaded Sure imports on publish errors
* fix(api): reset preserved Sure imports after enqueue failure
* fix(api): tighten Sure import upload handling
* test(api): align import API key fixtures
* docs(api): document import publish failure IDs
2026-05-01 22:56:18 +02:00
ghost and GitHub
b710b55124
feat(api): add recurring transaction endpoints ( #1600 )
...
* feat(api): add recurring transaction endpoints
* fix(api): return validation errors for recurring writes
* fix(api): harden recurring transaction request handling
* fix(api): require writable recurring account access
* fix(api): default null recurring manual flag
* fix(api): tighten recurring transaction contracts
* test(api): align recurring transaction fixtures
* docs(api): regenerate recurring transaction OpenAPI
2026-05-01 21:21:34 +02:00
783309188f
feat(api): expose rule export endpoints ( #1602 )
...
* feat(api): expose rule export endpoints
* fix(api): tighten rule export contracts
* fix(api): document balance sheet auth errors
* test(api): align rule API key fixtures
* Update docs/api/openapi.yaml
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Signed-off-by: Juan José Mata <jjmata@jjmata.com >
* Quick win
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Signed-off-by: Juan José Mata <jjmata@jjmata.com >
---------
Signed-off-by: Juan José Mata <juanjo.mata@gmail.com >
Signed-off-by: Juan José Mata <jjmata@jjmata.com >
Co-authored-by: Juan José Mata <juanjo.mata@gmail.com >
Co-authored-by: Juan José Mata <jjmata@jjmata.com >
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2026-05-01 19:47:06 +02:00
352c301e4b
feat(api): expose valuation history index ( #1596 )
...
* feat(api): expose valuation history index
* fix(api): hide valuation exception details
* fix(api): reuse eager-loaded valuation entries
* fix(api): tighten valuation index contracts
* fix(api): scope valuation filter errors
* docs(api): nest valuation account filter format
* Fix merge conflict mistakes
---------
Signed-off-by: Juan José Mata <juanjo.mata@gmail.com >
Co-authored-by: Juan José Mata <juanjo.mata@gmail.com >
Co-authored-by: Juan José Mata <jjmata@jjmata.com >
2026-05-01 19:09:56 +02:00
ghost and GitHub
cc043b5caf
feat(api): expose complete account export state ( #1597 )
...
* feat(api): expose complete account export state
* fix(api): handle malformed account identifiers
* fix(api): tighten account export contracts
* fix(api): correct account id OpenAPI format
* fix(api): tighten account docs auth contracts
* docs(api): document balance sheet auth errors
* docs(api): clarify account scope fixture
2026-05-01 15:22:28 +02:00
ghost and GitHub
fbdcfdcab7
fix(imports): preserve Sure opening balance history ( #1595 )
2026-05-01 12:24:41 +02:00
ghost and GitHub
072f92c715
fix(imports): preserve account status from backups ( #1603 )
2026-04-30 23:53:55 +02:00