Artifact 5a4e27ac2c80a453acbff5266f4aaba90a1ccd94ca40eb12e64b586989e525b7:
- File
docs/api.md
— part of check-in
[4831e9bef1]
at
2026-08-16 18:34:05
on branch trunk
— index: fold attachments (A card)
The last data delta against fossil. quarry parsed the A card into an Attach and dropped it, so attachments were invisible: sqlite showed none of its 11, tcl none of its 3,333. Both now match fossil's own table exactly.
Fossil models attachments as a log, not a set — the newest card per filename wins and a card with no source is a DELETION — so resolving them wrong resurrects deleted files. Real corpora exercise that: 1 deleted on sqlite, 10 on tcl.
Content is not linkable yet. Serving arbitrary attached bytes needs a decided Content-Disposition and CSP posture, so the page names each file and the raw-artifact route stays its own decision. (user: dmestas, size: 9340) [annotate] [blame] [check-ins using]
# quarry API Generated from the op registry by `quarry docs` — edit the ops, not this file; regenerate with `make docs`. Every op also appears in the OpenAPI document (`quarry spec`). Query inputs ride the query string; the same names work as JSON. ## checkin.diff `GET /api/v1/r/{repo}/checkin/{hash}/diff` — query, anonymous Diff one check-in against its primary parent. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `hash` | string | `required,min=4,max=64` | Output fields: - `from` (string) - `to` (string) - `files` (array of object {status: string, name: string}) - `unified` (string) - `note` (string) ## checkin.get `GET /api/v1/r/{repo}/checkin/{hash}` — query, anonymous Describe one check-in: metadata, parents, and its file set. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `hash` | string | `required,min=4,max=64` | Output fields: - `hash` (string) - `branch` (string) - `date` (string) - `user` (string) - `comment` (string) - `parents` (array of string) - `files` (array of object {blob: string, name: string}) ## file.get `GET /api/v1/r/{repo}/file/{hash}/{path...}` — query, anonymous Fetch one file's content at a check-in. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `hash` | string | `required,min=4,max=64` | | `path` | string | `required,max=512` | Output fields: - `hash` (string) - `path` (string) - `size` (integer) - `binary` (boolean) - `content` (string) - `html` (string) ## forum.get `GET /api/v1/r/{repo}/forum/{root}` — query, anonymous Fetch one forum thread: every post, rendered, in reading order. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `root` | string | `required,min=4,max=64` | Output fields: - `root` (string) - `title` (string) - `posts` (array of object {hash: string, parent: string, date: string, user: string, html: string}) ## forum.list `GET /api/v1/r/{repo}/forum` — query, anonymous List a repository's forum threads, most-recently-active first. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | Output fields: - `threads` (array of object {root: string, title: string, posts: integer, updated: string, user: string}) - `count` (integer) ## forum.post `POST /api/v1/r/{repo}/forum` — command, token Open a new forum thread. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `title` | string | `required,max=200` | | `body` | string | `required,max=1048576` | | `mimetype` | string | `max=64` | Output fields: - `hash` (string) ## forum.reply `POST /api/v1/r/{repo}/forum/{root}` — command, token Reply to a forum post within its thread. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `root` | string | `required,min=4,max=64` | | `body` | string | `required,max=1048576` | | `mimetype` | string | `max=64` | Output fields: - `hash` (string) ## meta.docs `GET /api/v1/docs` — query, anonymous The API reference, generated from this registry and rendered. Output fields: - `markdown` (string) - `html` (string) ## meta.version `GET /api/v1/version` — query, anonymous Report the quarry build version. Output fields: - `version` (string) ## repo.list `GET /api/v1/repos` — query, anonymous List the served repositories with their tip check-in. Output fields: - `repos` (array of object {name: string, checkins: integer, tipDate: string, tipComment: string, indexing: boolean}) - `count` (integer) ## search.query `GET /api/v1/r/{repo}/search` — query, anonymous Full-text search over a repository's check-ins, wiki, and tickets. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `q` | string | `required,max=200` | | `limit` | integer | `min=0,max=200,default=50` | Output fields: - `results` (array of object {kind: string, ref: string, label: string, snippet: string}) - `count` (integer) ## technote.add `POST /api/v1/r/{repo}/technote` — command, token Record a technote; passing an existing event id records an edit. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `body` | string | `required,max=1048576` | | `mimetype` | string | `max=64` | | `comment` | string | `max=200` | | `event` | string | `max=64` | Output fields: - `event` (string) - `hash` (string) ## technote.get `GET /api/v1/r/{repo}/technote/{event}` — query, anonymous Fetch one technote, rendered, by event-id prefix. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `event` | string | `required,max=64` | Output fields: - `event` (string) - `date` (string) - `user` (string) - `comment` (string) - `body` (string) - `html` (string) ## technote.list `GET /api/v1/r/{repo}/technote` — query, anonymous List a repository's technotes at their latest edit, newest first. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | Output fields: - `notes` (array of object {hash: string, event: string, date: string, user: string, mimetype: string, comment: string, body: string}) - `count` (integer) ## ticket.get `GET /api/v1/r/{repo}/ticket/{id}` — query, anonymous Fetch one ticket: folded state plus change history. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `id` | string | `required,min=4,max=40` | Output fields: - `ticket` (object {id: string, created: string, updated: string, fields: array of object {name: string, value: string}, changes: array of object {hash: string, date: string, user: string, fields: array of object {name: string, value: string}}}) - `attachments` (array of object {hash: string, name: string, src: string, date: string, user: string}) ## ticket.list `GET /api/v1/r/{repo}/ticket` — query, anonymous List a repository's tickets with their folded current state. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `limit` | integer | `min=0,max=200,default=50` | | `before` | string | `max=96` | Output fields: - `tickets` (array of object {id: string, title: string, status: string, updated: string}) - `count` (integer) - `next` (string) ## ticket.new `POST /api/v1/r/{repo}/ticket` — command, token Open a new ticket. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `title` | string | `required,max=200` | | `status` | string | `max=40` | | `comment` | string | `max=65536` | Output fields: - `id` (string) - `hash` (string) ## ticket.set `POST /api/v1/r/{repo}/ticket/{id}` — command, token Record a ticket change; empty fields are left untouched. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `id` | string | `required,min=4,max=40` | | `title` | string | `max=200` | | `status` | string | `max=40` | | `resolution` | string | `max=40` | | `comment` | string | `max=65536` | Output fields: - `hash` (string) ## timeline.list `GET /api/v1/r/{repo}/timeline` — query, anonymous List a repository's events — check-ins, wiki edits, ticket changes — newest first, paged by `before`. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `limit` | integer | `min=0,max=200,default=50` | | `before` | string | `max=96` | | `branch` | string | `max=64` | | `y` | string | `oneof=all\|ci\|w\|t\|e\|f` | Output fields: - `entries` (array of object {kind: string, hash: string, ref: string, date: string, user: string, comment: string, branch: string, isLeaf: boolean, isMerge: boolean, parents: array of string}) - `count` (integer) - `next` (string) ## wiki.get `GET /api/v1/r/{repo}/wiki/{name}` — query, anonymous Fetch one wiki page, rendered — latest, or the revision named by rev. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `name` | string | `required,max=100` | | `rev` | string | `max=64` | Output fields: - `hash` (string) - `title` (string) - `date` (string) - `user` (string) - `mimetype` (string) - `source` (string) - `html` (string) ## wiki.history `GET /api/v1/r/{repo}/wiki/{name}/history` — query, anonymous List every recorded edit of one wiki page, newest first. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `name` | string | `required,max=100` | Output fields: - `title` (string) - `edits` (array of object {hash: string, date: string, user: string}) - `count` (integer) ## wiki.list `GET /api/v1/r/{repo}/wiki` — query, anonymous List a repository's wiki pages with their latest edit. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | Output fields: - `pages` (array of object {title: string, date: string, user: string}) - `count` (integer) ## wiki.save `POST /api/v1/r/{repo}/wiki/{name}` — command, token Record a wiki page edit (creates the page on first save). Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `name` | string | `required,max=100` | | `body` | string | `required,max=1048576` | | `mimetype` | string | `max=64` | Output fields: - `hash` (string)