| Age | Commit message (Collapse) | Author | Files | Lines |
|
Transfers are easy to reverse silently (swapped --from/--to), showing up
later as a 2x balance discrepancy (ISSUES.md #5). On a transfer, tx add now
prints "transfer: <from> → <to>, <amount>" to stderr before writing, in both
the real-write and --dry-run paths. stdout JSON and exit codes are unchanged,
so the contract holds; PATCH bump. Withdrawals/deposits are unaffected.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
|
Re-running an import (a retried or double-read batch) created phantom
duplicate transactions and drifted balances, with no signal.
--skip-dupes searches for an existing tx with the same amount + date +
source + destination before writing; on a match it emits
{"skipped": "duplicate", "matched_id": "<id>"} and exits 0 without writing.
Off by default (one extra search per add only when set). dry-run wins over
skip-dupes: a preview never triggers the search. Match is amount+date+
accounts, not description, so genuinely distinct same-value same-day
transfers between the same accounts look like duplicates; documented.
Also document a Firefly quirk in SKILL.md: a missing/deleted transaction id
returns 401 (not 404) on tx get/edit/delete, so a 401 after delete confirms
the record is gone rather than signalling an auth failure.
Verified live on the test instance: create -> identical --skip-dupes skips
with matched_id and no write, --dry-run --skip-dupes previews without
searching, no-match --skip-dupes writes; records cleaned up after.
PATCH: new optional flag, contract unchanged.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
|
An agent importing rows in a loop could fail mid-batch: a --to account that
didn't exist yet errored after earlier rows had already been written, leaving
a half-applied batch to clean up by hand.
--dry-run resolves --from/--to and infers the type but sends nothing, printing
{"dry_run": true, "would_send": {...}}. A missing account stays a hard error
(exit 1) so the agent can dry-run every row first, create the accounts the
errors name, then run the batch for real. No batch input mode: the agent
already owns the loop.
Verified live read-only: valid accounts emit would_send and write nothing
(search confirms []), missing account exits 1 with the candidate list.
PATCH: new optional flag, contract unchanged.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
|
Reconciliation needed an account's balance as of a past date; the command
only reported the current balance, forcing hand-written sum scripts.
--at YYYY-MM-DD re-fetches the account with Firefly's ?date= param, which
recomputes current_balance as of that date (end of day, no client math).
Without --at the current-balance path is unchanged (no extra API call).
Verified live read-only against real data: Mediolanum current 183.23 vs
--at 2026-06-10 164.38, boundary probe gives distinct daily balances.
PATCH: new optional flag, contract unchanged.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
|
tx list silently returned only --limit rows (default 20) with no signal
when more matched, making a correct ledger look wrong during reconciliation.
- --all auto-paginates every page via meta.pagination.total_pages
- without --all, print "showing N of M (use --all for all)" to stderr
when the result is truncated (stdout JSON stays clean)
PATCH: new optional flag + stderr note, contract unchanged.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
|
Implements ISSUES.md #1, the missing other half of an import tool:
correcting and removing mis-imported transactions without the web UI.
- tx edit <id>: PATCH a single-split journal; only the fields passed are
sent (--amount/--date/--desc/--from/--to/--category/--tags/--type). Errors
if no field is given. Accounts resolve to ids; category/tags pass raw.
- tx delete <id>: requires --yes (no interactive prompt, agent-first);
prints {"deleted": "<id>"} on success.
Also fix gen_completion.py: running it as a script put scripts/ on
sys.path[0] and imported the installed (stale) firefly_cli, so the
generated completion drifted (missing account balance/get, tx get/search).
Prepend the repo root so the documented regen command uses this tree. The
regenerated completion now reflects the full command surface.
MINOR bump per the contract-keyed scheme: new commands, no breaking change.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
|
New `firefly account create <name> --type asset|expense|revenue`
[--opening-balance N] [--currency CODE]. asset accounts default to
the defaultAsset role; opening balance is dated today (Firefly pairs
the two). Unsupported types (liability, etc.) are a hard client-side
error with no API call. Live-verified against the test instance.
Bumps to 0.2.0. Docs synced: README, CLAUDE.md, SKILL.md, including
the category/tag auto-create clarification.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
|
Pass --category straight to Firefly III as category_name; the API
creates the category if it does not exist, matching --tags behavior.
Drops the resolver lookup that turned an unknown category into a hard
error. Accounts still resolve strictly (real money).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|