64f654ec6bcc5066177cf2f90c59d979fcdb5905
opencode discovers AGENTS.md and nothing else; claude code discovers CLAUDE.md. this repo had neither, so an agent sent to change something here arrived with no guidance at all under either. it deliberately does NOT repeat README.md. that file says what the plugin is, for someone deciding whether to install it. this one answers the other question: i have to change something in here, what will i break. the facts in it are read from the repository rather than recalled — the panel keys from web/panels.ts, the tables from db/schema.ts, the permission keys, the host binaries and the route claims from manifest.ts. presence is the declaration everywhere in this system, so the file says what the platform will actually conclude from these files existing. CLAUDE.md beside it is a pointer, not a copy: two copies drift and the stale one is the one somebody reads.
Invoices
Your InvoiceShelf books, inside Officer — invoices, estimates, customers and payments, with the credentials held server-side.
What you get
- Invoices — list, filter by status, open one and see its lines
- Estimates — the same, before they become invoices
- Customers and their history
- Payments recorded against invoices
- Multiple companies — add several sets of books and switch between them
Requirements
A running InvoiceShelf instance Officer can reach, and credentials for it.
Setup
Install the plugin, open /invoices, and add an account: a label, the URL, and the credentials. They are encrypted at rest and never sent to the browser. Mark one active.
The plugin does not install or supervise InvoiceShelf. Point it at one you already run.
Permissions
One permission, invoices, grantable per role like any other app permission.
Notes
- The plugin is named
invoices, notinvoiceshelf— named for what it shows rather than the daemon behind it, which is what keeps the URL/invoices. SeePLUGIN.md.
Languages
TypeScript
100%