Published to crates.io today; the Unreleased content from earlier
sessions becomes this release's entry instead of staying provisional.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
These four resources are the only ones with the SDK's
entity_action_methods! route. Adds:
- `action <id> <action>` - mark_sent, mark_paid, archive, restore,
clone_to_invoice, clone_to_quote, auto_bill, delete (routed), returning
the updated record.
- `download <id>...` - the rendered PDF, to stdout or `--out <path>`;
more than one id streams a single merged PDF (Invoice Ninja's bulk
download action).
New EntityResourceArgs/EntityAction in cli.rs rather than extending the
existing ResourceArgs/Action: Rust enums don't compose, and every
resource's `run` match on Action needs to stay exhaustive without a
catch-all arm for variants it doesn't support.
Found and fixed along the way: the Download variant's --output <path>
field collided by name with the global --output table|json flag,
causing clap to panic at runtime trying to downcast the wrong type.
Renamed to --out.
Extended tests/nixos-test.nix to exercise action/download for real
against the VM. That caught a test-ordering bug of its own - asserting
mark_sent on an invoice *after* paying it off, which correctly doesn't
revert status_id from paid back to sent - fixed by reordering the
subtests. nix flake check passes clean.
Also backfills two CHANGELOG.md gaps from earlier sessions: the VM test
and CI additions had never actually been logged there.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adds an invoiceninja-nixos flake input and two things built from it:
- nixosConfigurations.invoiceninja-test-nginx/-caddy: manual test
VMs, re-exported as-is from that repo rather than redefined here —
same principle as this crate being a client of the SDK, not a
second implementation of it.
- checks.invoiceninja-cli: an automated nixosTest (tests/, adapted
from invoiceninja-nixos's own test scaffolding) that boots a real
Invoice Ninja instance and runs the actual invoiceninja-cli binary
against it - create/list/get/update/invoice/payment/delete across
clients, invoices, and payments - rather than raw curl.
tests/common.nix's module import had to change from a relative
../nixos-module/invoiceninja.nix (which doesn't exist here) to a
parameter threaded from the flake input's nixosModules.invoiceninja.
Building the VM pulls from the invoiceninja-nixos cachix cache via a
nixConfig block, mirroring that repo's own.
Also fixes a wrong assumption the first version of this test's final
assertion made, caught by actually running it against a real server:
`clients list` with no `--status` does not exclude soft-deleted
records - confirmed empirically (Invoice Ninja returns everything
regardless of is_deleted unless status=active is passed explicitly).
Corrected the test to check is_deleted via `clients get` instead, and
fixed the misleadingly-incomplete --status doc comment in cli.rs that
had the same wrong assumption baked in.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Finishes the mechanical rollout: every resource using
resource_methods!/crud_methods! in the SDK (list/get/create/update/
delete, no bulk/uploads/entity-actions) is now wired up, 33 in
total. recurring_quotes.rs mirrors recurring_invoices.rs the same
way quotes.rs mirrors invoices.rs, since RecurringQuote is also a
type alias for RecurringInvoice in the SDK.
client_gateway_tokens, companies, and system_logs use the SDK's
crud_methods! rather than resource_methods! (no /bulk route in
Invoice Ninja for these) - doesn't change anything here, since this
CLI doesn't expose bulk actions yet either way.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Five more resources following clients.rs's template exactly, same as
the previous batch. credits.rs is otherwise identical to quotes.rs
since Credit is also a type alias for Invoice in the SDK (same table,
distinguished by entity_type upstream).
Verified against a live local server: full create/list/get/update/
delete round trip for all five.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Five more resources following clients.rs's template exactly: the
same list/get/create/update/delete shape, including the
fetch-merge-write pattern for update. quotes.rs is otherwise
identical to invoices.rs since Quote is a type alias for Invoice in
the SDK (same table, distinguished by entity_type upstream).
Verified against a live local server: full create/list/get/update/
delete round trip for all six resources, confirming update preserves
fields the caller didn't mention.
Also adds CHANGELOG.md (Keep a Changelog format, matching the SDK's)
and updates README/CLAUDE.md's resource counts.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Now that the SDK dependency resolves from crates.io instead of a
sibling checkout, a workflow here needs nothing special to build.
Same three jobs as the SDK's own ci.yml: pinned-toolchain test, a
build-only msrv job on the declared 1.88 floor, and an advisory
stable job that reports red but stays out of required status checks.
Verified locally: all four `test`-job commands pass with the pinned
1.99.1 toolchain, and a build+test against an actual rustc 1.88.0
toolchain confirms the msrv job will be green too.
Resolves the "own CI" open question in GOALS.md into goal 6; adds the
matching "Rust version and CI" section to CLAUDE.md.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Gitea (origin) is canonical with a push mirror to GitHub, same setup
as invoiceninja-sdk. Points at the GitHub mirror to match that
crate's Cargo.toml and clear cargo's "no documentation, homepage or
repository" publish warning.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
A command-line client for the Invoice Ninja v5 API, built on the
invoiceninja-sdk crate (consumed from crates.io, 0.2.0). Only the
clients resource is wired up so far, as the template the rest follow
- see CLAUDE.md and GOALS.md for the reasoning behind the shape of
things (the update fetch-merge-write pattern, why there's no Cargo
workspace with the SDK, the local-checkout override for
co-development, and the Nix flake packaging via packages.default and
overlays.default).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>