Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,28 @@

All notable changes to GitRoll are documented here. GitRoll follows [semantic versioning](https://semver.org). The Roll file format has its own version, documented in [SPEC.md](SPEC.md).

## Unreleased

### Changed
- **A purchase is counted once in the ledger.** When the event that bought a thing links to it, in its text or a front matter field, the thing's own `price` is no longer added on top of it. That event is the one with an `amount` dated on the thing's `purchaseDate`, or, when it has none, the one whose amount is its price exactly, in the same currency; a service or a repair that links to it with an amount of its own leaves the price counted. A thing with a price and no purchase event is counted by its price as before, and `gitroll inventory` still values it by its price. SPEC.md says so under **Inventory vocabulary**.
- **A collection includes the folders under it.** `notes/inventory/tools/drill.md` is in `gitroll inventory`, `records inventory` and the browser app's Inventory, a place in `notes/places/home/` stays in the Places tree, and a person in `notes/people/family/` is a contact, the same way in every view, `--collection` and the browser app; `records books/sci-fi` still reads only that folder, and `gitroll records` counts each collection's sub-folders with it. SPEC.md says so under **Records and collections**.
- **A saved search works wherever a query does.** `@name` runs one in `issues`, `ledger`, `records`, `inventory`, `series`, `contacts`, `organizations`, `places`, `notes`, `todos`, `files` and every browser search box, as well as `find`, and over MCP, and combines with anything else typed beside it: `gitroll find "@unpaid amount>10"`. A name that isn't saved says so instead of finding nothing.
- **A resolved issue stops coming back.** Its open to-dos, its reminders and its repeats are left out of `todos`, `upcoming`, `reminders`, `calendar`, the `.ics` file and the browser app's Upcoming page; they stay in its file, `todos --all` still lists them, and reopening it brings them back. SPEC.md says so under **Issues**.
- **An organization lists what it supplied.** A thing whose `vendor:` links to an organization — the e-bike bought from Bolt Cycles — is listed with it: `supplied` in `gitroll organizations --json`, after its people in the text, and a **Supplied** column on **Organizations** in the browser app, as a place lists the things whose `location` links to it. An event's `vendor:` is still its history. SPEC.md adds `vendor` to the inventory vocabulary.
- **A contact whose `org` names an organization is linked to it.** `org: bolt` already made Sam one of Bolt Cycles' people, by its `alternateName`, but `gitroll contacts` gave him no `orgPath`. It is now the organization's record when exactly one in `.gitroll/notes/organizations/` goes by that name, and still null when none or two do.
- **`gitroll calendar --ics` and `calendar` leave out an event logged today.** SPEC.md puts events dated ahead of today on the calendar, and an event `gitroll log` writes is dated the moment it was logged: it happened, it isn't coming. An event dated today with no time, or at a time already past, is no longer listed as upcoming; one later today, or on a day ahead, still is. `upcoming` and the browser app's **Upcoming** read it the same way.
- **`gitroll contacts --vcf` writes a sealed `tel` opened when a key on this computer opens it.** It is the key holder's own address book going out. Without a key the property is still left out, never written as ciphertext, and now the command says which ones (on stderr, so the file on stdout is untouched; `sealed` in `--json`).
- **`gitroll records --csv` says when it writes sealed fields.** They go out as their ciphertext, as they always did, so the CSV opens nothing and `gitroll import csv` brings them back sealed; the command now says so on stderr, `--json` lists them in `sealed`, and docs/CLI.md and SPEC.md describe it.
- **`edit --text` keeps the `# Title` heading.** New words replaced the whole text, heading included, so editing a contact's notes could rename them. The heading stays unless the new text starts with a `# ` heading of its own. The agent guide says so (version 10).

### Fixed
- **A file's dates are on the calendar.** A sidecar's `expires` (or `warranty`, `due`, `renewal`, `start` and `remind`), as in SPEC.md's own passport example, never reached `upcoming`, `reminders`, `calendar` or the `.ics` file. It does now, and a sidecar's links count too: in `gitroll related` and an entry's page in the browser app, and in `gitroll places`, which lists a file whose sidecar links to a place under `files`.
- **The browser app says whether an issue is open.** The timeline and an entry's page showed the raw `issue: open` field on an issue long since resolved; they show **Open issue** or **Resolved issue** instead, as `gitroll issues` reads it.
- **Editing a file keeps its own flow lists.** `set`, `pin`, `seal`, `attach --to`, `edit` and `move` rewrote `projects: [bike]` as `projects: [ bike ]`, the YAML library's own spacing, in every file they touched. Each file now keeps the spacing its flow lists already have, `[bike]` or `[ bike ]`, and a list added to it is written the same way; a new file is written as before.
- **What a write returns never holds ciphertext.** `set`, `pin`, `edit`, `todo`, `done`, `close`, `move`, `restore`, `attach` and the rest returned the entry with each sealed field's armored text in `meta`, on the command line with `--json` and over MCP, while `show` and `find` gave `{"sealed": true}`. They now return it as a read does. The files are unchanged; `gitroll files --json` masks a sidecar's sealed fields too.
- **An `org` that links to an organization and names a unit is a link everywhere.** `org: "[Acme](../organizations/acme.md);Research"` made Ada one of Acme's people but, not being exactly a link, wasn't one to `gitroll related`, backlinks or `check`, and `move` didn't count it among the links it rewrote. Its link part now counts wherever a front matter link does.
- **A link in a field or a to-do shows as its text.** `gitroll records`, `show`, `set`, `todos`, `upcoming` and `reminders`, an entry's fields and **Upcoming**'s to-dos in the browser app showed `[Maria](../people/maria.md)` as written, while the browser app's records table showed `Maria`. They all show the text now, and in the browser app it is a link to the note or page; `--json` keeps the value as written.

## 0.7.0 (2026-10-07)

### Added
Expand Down
12 changes: 6 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,11 +124,11 @@ gitroll issues # open issues, how long each has been open,
gitroll close clunk --note "New sway bar link" # logs an event whose resolves: links to the issue
```

An issue is resolved by `resolved: <date>` on it, or by a later event that `resolves:` it. The second way is read back like a backlink, so the issue's own file is left as it was and what fixed it is told in the event that fixed it.
An issue is resolved by `resolved: <date>` on it, or by a later event that `resolves:` it. The second way is read back like a backlink, so the issue's own file is left as it was and what fixed it is told in the event that fixed it. Once it is resolved, its open to-dos, reminders and repeats are off the calendar, though still in its file.

### Records, and the views over them

A folder of notes is a **collection** and each note in it a **record**, its fields in front matter. Nothing has to be declared first: the fields are whatever you wrote.
A folder of notes is a **collection** and each note in it a **record**, its fields in front matter, the folders under it included. Nothing has to be declared first: the fields are whatever you wrote.

```bash
gitroll add books "Dune" --field rating=5 --field status=read
Expand Down Expand Up @@ -167,7 +167,7 @@ The browser header and `gitroll status` show which repository and **branch** the
| `gitroll restore <file>` | Put an earlier version back, as a new commit |
| `gitroll conflicts` / `gitroll resolve <file> --mine` | Settle an event that was changed in two places |
| `gitroll related <file>` | What it links to, and what links back |
| `gitroll find "tag:incident" --save incidents` | Keep a search; run it later with `gitroll find @incidents` |
| `gitroll find "tag:incident" --save incidents` | Keep a search; run it later with `gitroll find @incidents`, or `@incidents` in any query (`gitroll ledger "@incidents after:2026-01-01"`) |
| `gitroll find "postgres" --all` | Search every Roll you have |
| `gitroll import github` / `gitroll import ci` | Log merged pull requests and releases, and builds that failed |

Expand Down Expand Up @@ -319,7 +319,7 @@ gitroll sync
| `gitroll upcoming [--days 30]` | What's coming up: appointments (`start`, `rrule`), to-dos with a `📅` date, warranties and renewals |
| `gitroll calendar --ics > roll.ics` | The Roll's calendar as an iCalendar file any calendar app can import, reminders included as alarms |
| `gitroll remind "Call the dentist" --at "2026-11-01 09:00"` | A to-do with a reminder (`⏰ 2026-11-01 09:00`); `gitroll reminders [--due]` lists them, due ones first |
| `gitroll ledger [--by month] [--hledger]` | Totals of `amount` and `price` per currency, or an hledger journal of them |
| `gitroll ledger [--by month] [--hledger]` | Totals of `amount` and `price` per currency (a price only when no linked event is its purchase), or an hledger journal of them |
| `gitroll series <field> [query] [--by month]` | One number field over time (odometer, weight, a meter): each reading, a sparkline, change and rate per day and month |
| `gitroll inventory [--by location]` | Your things (`notes/inventory/`): value, where they are, warranties ending, what to restock |
| `gitroll contacts [query] [--vcf]` / `gitroll import vcf <file.vcf>` | People (`notes/people/`, vCard's field names) and when you last contacted each; an address book file out, and one in |
Expand Down Expand Up @@ -361,7 +361,7 @@ itself is never touched: `gitroll set files/passport.pdf title=Passport
expires=2030-05-01`, or write the front matter by hand. Sidecars use Dublin Core
names (`title`, `creator`, `date`, `subject`, `description`) plus whatever else
you like, and they are searched like any record: `gitroll find 'is:file
expires<2031'`. A photo's sidecar gets its date from the camera's EXIF data.
expires<2031'`. Its `expires` is on the calendar, as a record's would be, and a sidecar that links to a place puts the file there. A photo's sidecar gets its date from the camera's EXIF data.

GitHub refuses files over 100 MB, so a file larger than 45 MB is kept as
numbered parts — `walkthrough.mp4.001`, `.002`, … — with its size and sha256 in
Expand Down Expand Up @@ -436,7 +436,7 @@ filters:

Each one is a toggle over whatever is already in the box, in the order you list them. `filters: []` means no buttons at all. Leave the key out and you get the three defaults — **With a photo** isn't among them, because a button that matches almost nothing in most Rolls is a button in the way; the line above puts it back.

Searches of your own go beside them. **Save search** keeps what is in the box under a name, the same as `gitroll find "tag:incident has:date" --save open-incidents`; one click runs it again, and **Edit saved** renames or deletes it. Saved searches are kept in your settings folder rather than in a Roll, so they are yours on this computer, offered in every Roll you open here, never committed or shared, and `gitroll find @open-incidents` runs the same one in a terminal. `gitroll searches` lists them.
Searches of your own go beside them. **Save search** keeps what is in the box under a name, the same as `gitroll find "tag:incident has:date" --save open-incidents`; one click runs it again, and **Edit saved** renames or deletes it. Saved searches are kept in your settings folder rather than in a Roll, so they are yours on this computer, offered in every Roll you open here, never committed or shared, and `gitroll find @open-incidents` runs the same one in a terminal. `@open-incidents` works in any search box and any command that takes a query, beside other filters. `gitroll searches` lists them.

### What backing up covers

Expand Down
Loading
Loading