Artifact d060b4ff6f970c05f6c815f25c2f108962c6d1fb7fddfdc3e15585b41678a659:
- File
docs/api.md
— part of check-in
[57a2f8e3d2]
at
2026-08-24 20:20:43
on branch doc-search
— search: documentation is searchable (fossil's scope "d")
quarry rendered tree documents as a first-class surface — the docs tab, the reading furniture — and could not find them. A reader could open www/quickstart.wiki and get nothing searching for it. Fossil searches c d t w e f; quarry had everything but d.
Indexed at the default branch tip only, asynchronously, on the trigger warmReads already uses: a round that moved the tip, plus once at boot. Not through dagnats — dagnats is optional, a forge without one "simply has no CI rather than a broken one", and search must not inherit that. This is local derivation from the store, the same class of work as the fold, which Reindex already routes around the bus on purpose.
isDocPath is exported so the indexer and the docs listing share one definition of what a document is; two would drift and the drift would be invisible.
Adding the kind exposed how many places the list is written down: the index, two ops validators, the scope chips, hitOf. The validator was missed and refused every doc search before it reached the query. Two tests now hold the four in agreement. (user: dmestas, size: 36600) [annotate] [blame] [check-ins using] [more...]
# 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. ## account.add `POST /api/v1/accounts` — command, admin Create a forge account. The password is hashed with argon2id and never stored or returned in plaintext. Input: | field | type | rules | |---|---|---| | `name` | string | `required,max=64` | | `password` | string | `required,max=1024` | | `admin` | boolean | — | Output fields: - `name` (string) - `admin` (boolean) ## account.delete `POST /api/v1/accounts/delete` — command, admin Delete an account and all of its grants. Input: | field | type | rules | |---|---|---| | `name` | string | `required,max=64` | Output fields: - `name` (string) ## account.grant `POST /api/v1/accounts/grant` — command, admin Grant an account read, write or admin on one repository. Input: | field | type | rules | |---|---|---| | `name` | string | `required,max=64` | | `repo` | string | `required,max=64` | | `role` | string | `required,oneof=read\|write\|admin` | Output fields: - `name` (string) - `repo` (string) - `role` (string) ## account.list `GET /api/v1/accounts` — query, admin List forge accounts and their per-repository grants. Output fields: - `accounts` (array of object {Account: object {name: string, admin: boolean, created: string}, grants: array of object {repo: string, role: string}}) - `count` (integer) ## account.passwd `POST /api/v1/accounts/passwd` — command, admin Set an account's password. Input: | field | type | rules | |---|---|---| | `name` | string | `required,max=64` | | `password` | string | `required,max=1024` | Output fields: - `name` (string) ## account.revoke `POST /api/v1/accounts/revoke` — command, admin Remove an account's grant on one repository. Input: | field | type | rules | |---|---|---| | `name` | string | `required,max=64` | | `repo` | string | `required,max=64` | Output fields: - `name` (string) - `repo` (string) - `role` (string) ## archive.get `GET /api/v1/r/{repo}/archive/{version}` — query, anonymous Download a check-in's files as a reproducible archive (tar.gz or zip). Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `version` | string | `max=100` | | `format` | string | `oneof=tar\|zip` | Output fields: - `name` (string) - `size` (integer) - `version` (string) - `content` (string) ## artifact.resolve `GET /api/v1/r/{repo}/info/{prefix}` — query, anonymous Resolve an artifact hash prefix to its kind and canonical reference — fossil's /info dispatch. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `prefix` | string | `required,min=4,max=64` | Output fields: - `kind` (string) - `ref` (string) ## attachment.get `GET /api/v1/r/{repo}/attachment/{hash}` — query, anonymous Fetch one attachment's content by its content-artifact hash. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `hash` | string | `required,min=4,max=64` | Output fields: - `name` (string) - `size` (integer) - `content` (string) ## branch.list `GET /api/v1/r/{repo}/branch` — query, anonymous List branches with their tip check-in, most recently active first. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | Output fields: - `branches` (array of object {name: string, tip: string, date: string, closed: boolean}) - `count` (integer) ## 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` | | `file` | string | `max=4096` | | `offset` | integer | `min=0` | | `maxLines` | integer | `min=0` | | `branch` | boolean | — | | `from` | string | `max=64` | | `unified` | boolean | — | Output fields: - `from` (string) - `to` (string) - `files` (array of object {status: string, name: string}) - `structured` (array of object {path: string, prevPath: string, change: string, hunks: array of object {oldStart: integer, newStart: integer, header: string, lines: array of object {kind: string, oldNum: integer, newNum: integer, tokens: array of object {class: string, text: string, mark: boolean}}}, added: integer, deleted: integer, before: integer, omitted: integer}) - `unified` (string) - `note` (string) - `omittedLines` (integer) - `nextOffset` (integer) - `totalLines` (integer) - `lastOffset` (integer) - `offset` (integer) ## 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` | | `files` | string | `max=4` | Output fields: - `hash` (string) - `ci` (string) - `branch` (string) - `date` (string) - `user` (string) - `comment` (string) - `parents` (array of string) - `files` (array of object {blob: string, name: string, size: integer, perm: string, binary: boolean}) - `discussedIn` (array of object {root: string, title: string, posts: integer, created: string, updated: string, user: string, excerpt: string, hasPoll: boolean, participants: array of string, dates: array of string}) - `tags` (array of string) - `commentOrig` (string) - `hidden` (boolean) - `closed` (boolean) - `fork` (string) - `context` (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, ci: string, commentOrig: string, hidden: boolean, closed: boolean, excerpt: string}) ## checkin.manifest `GET /api/v1/r/{repo}/checkin/{hash}/manifest` — query, anonymous One check-in's manifest artifact, as cards. The file list is counted, not returned — it is 99% of the bytes and the tree browser already renders it. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `hash` | string | `required,min=4,max=64` | Output fields: - `hash` (string) - `size` (integer) - `cards` (array of object {letter: string, text: string, note: string}) - `files` (integer) ## checkin.tags `GET /api/v1/r/{repo}/checkin/{hash}/tags` — query, anonymous The full tag history of a check-in — every tag artifact that touched it, oldest first, with which rows still stand. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `hash` | string | `required,min=4,max=64` | Output fields: - `hash` (string) - `date` (string) - `user` (string) - `comment` (string) - `commentOrig` (string) - `branch` (string) - `hidden` (boolean) - `closed` (boolean) - `events` (array of object {date: string, src: string, name: string, sign: string, value: string, standing: boolean}) ## ci.list `GET /api/v1/r/{repo}/ci` — query, anonymous List a repository's CI runs, newest first. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `limit` | integer | `min=0,max=200,default=50` | Output fields: - `runs` (array of object {runId: string, checkin: string, workflow: string, pipeline: string, status: string, started: string}) - `count` (integer) ## doc.get `GET /api/v1/r/{repo}/doc/{hash}/{path...}` — query, anonymous Render one file from the tree as embedded documentation, chosen by extension. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `hash` | string | `required,min=1,max=64` | | `path` | string | `required,max=512` | Output fields: - `hash` (string) - `path` (string) - `size` (integer) - `mimetype` (string) - `html` (string) - `outline` (array of object {level: integer, id: string, text: string}) - `contentType` (string) - `content` (string) ## doc.list `GET /api/v1/r/{repo}/doc` — query, anonymous List the documents in a check-in's conventional documentation directories. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `version` | string | `max=64` | Output fields: - `version` (string) - `docs` (array of object {path: string, size: integer, date: string, user: 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) - `renderable` (boolean) ## file.history `GET /api/v1/r/{repo}/history/{version}/{path...}` — query, anonymous List the check-ins that changed one file, newest first. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `version` | string | `max=100` | | `path` | string | `required,max=1024` | | `limit` | integer | `min=0,max=200,default=50` | Output fields: - `path` (string) - `version` (string) - `changes` (array of object {hash: string, date: string, user: string, comment: string}) - `count` (integer) ## fleet.status `GET /api/v1/fleet` — query, admin Report every served store's ingest health. Output fields: - `repos` (array of object {name: string, code: string, checkins: integer, indexing: boolean, health: object {lastOk: string, roundSeconds: number, lastCount: integer, total: integer, fallbacks: integer, gaps: integer, lastErr: string, lastErrAt: string, failures: integer, stalled: boolean, retryAt: string}}) - `count` (integer) - `unhealthy` (integer) - `errors` (array of object {message: string, surface: string, path: string, count: integer, first: object {}, last: object {}}) - `errorTotal` (integer) ## fleet.sync `POST /api/v1/fleet/sync` — command, admin Run an ingest round now — one store, or every store when `repo` is empty. Input: | field | type | rules | |---|---|---| | `repo` | string | `max=64` | Output fields: - `results` (array of object {repo: string, artifacts: integer, err: string}) - `failed` (integer) ## 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) - `excerpt` (string) - `posts` (array of object {hash: string, parent: string, date: string, user: string, html: string, score: integer, yourVote: integer, hidden: boolean, hiddenReason: string, poll: object {present: boolean, question: string, options: array of string, counts: array of integer, percents: array of integer, total: integer, yourChoice: integer, closed: boolean, closes: string}}) - `yourSub` (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` | | `sort` | string | `max=8` | Output fields: - `threads` (array of object {ForumThread: object {root: string, title: string, posts: integer, created: string, updated: string, user: string, excerpt: string, hasPoll: boolean, participants: array of string, dates: array of string}, score: integer, category: string, spark: array of integer, dormant: boolean}) - `announcements` (array of object {ForumThread: object {root: string, title: string, posts: integer, created: string, updated: string, user: string, excerpt: string, hasPoll: boolean, participants: array of string, dates: array of string}, score: integer, category: string, spark: array of integer, dormant: boolean}) - `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) - `staged` (boolean) ## 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` | | `to` | string | `max=64` | | `body` | string | `required,max=1048576` | | `mimetype` | string | `max=64` | Output fields: - `hash` (string) - `staged` (boolean) ## landing.accept `POST /api/v1/r/{repo}/landing/{id}/accept` — command, token Land the branch on its target and settle the record. Writes a merge check-in, so it needs the check-in capability rather than the forum one. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `id` | string | `required,min=4,max=64` | | `message` | string | `max=65536` | Output fields: - `hash` (string) - `state` (string) ## landing.comment `POST /api/v1/r/{repo}/landing/{id}/comment` — command, token Add a remark to a landing's discussion. An ordinary forum reply. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `id` | string | `required,min=4,max=64` | | `message` | string | `max=65536` | Output fields: - `hash` (string) - `state` (string) ## landing.get `GET /api/v1/r/{repo}/landing/{id}` — query, anonymous One landing: the record, its discussion, and whether the caller may accept it. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `id` | string | `required,min=4,max=64` | Output fields: - `landing` (object {id: string, branch: string, target: string, title: string, author: string, opened: string, updated: string, state: string, settled_by: string}) - `posts` (array of object {transition: string, root: boolean}) - `canAccept` (boolean) - `mergeable` (string) - `conflicts` (array of string) ## landing.list `GET /api/v1/r/{repo}/landing` — query, anonymous Landings in this repository: branches proposed to land on a target, newest activity first. A landing is a forum thread, so it reads on the forum capability. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `state` | string | `max=16` | | `limit` | integer | `min=0,max=200,default=50` | Output fields: - `landings` (array of object {id: string, branch: string, target: string, title: string, author: string, opened: string, updated: string, state: string, settled_by: string}) - `open` (integer) - `count` (integer) ## landing.open `POST /api/v1/r/{repo}/landing` — command, token Propose a branch to land on a target. Mints a forum thread — no new artifact kind — so a stock fossil clone reads it as an ordinary discussion. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `branch` | string | `required,max=120` | | `target` | string | `max=120` | | `message` | string | `required,max=65536` | Output fields: - `id` (string) ## landing.reject `POST /api/v1/r/{repo}/landing/{id}/reject` — command, token Settle a landing without merging. Writes no check-in, so it needs only the capability to speak in the thread. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `id` | string | `required,min=4,max=64` | | `message` | string | `max=65536` | Output fields: - `hash` (string) - `state` (string) ## markup.preview `POST /api/v1/r/{repo}/markup-preview` — command, token Render markdown exactly as saving it would — the composer's preview IS the production renderer, so what you see is what readers get. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `body` | string | `max=1048576` | Output fields: - `html` (string) ## me.feed `GET /api/v1/me/feed` — query, token The signed-in dashboard: the caller's granted repositories ordered by activity, the merged activity feed across them, and the caller's own recorded work. Input: | field | type | rules | |---|---|---| | `kind` | string | `max=2` | | `offset` | integer | `min=0,max=1000` | | `find` | string | `max=64` | Output fields: - `user` (string) - `repos` (array of object {name: string, description: string, lastActivity: string, open: integer}) - `feed` (array of object {repo: string, kind: string, ref: string, hash: string, date: string, user: string, comment: string}) - `kinds` (array of object {kind: string, count: integer}) - `total` (integer) - `depth` (integer) - `mine` (array of object {repo: string, kind: string, ref: string, hash: string, date: string, user: string, comment: 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) ## mirror.detach `POST /api/v1/mirrors/detach` — command, admin Detach a store from its upstream: quarry becomes the source of truth and accepts writes; the upstream is kept as provenance (`detachedFrom`). Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | Output fields: - `repo` (string) ## mirror.list `GET /api/v1/mirrors` — query, admin List configured upstream mirrors and their recent history. Output fields: - `mirrors` (array of object {repo: string, url: string, every: integer, enabled: boolean, lastAt: string, lastOk: string, lastErr: string, failures: integer, acceptWrites: boolean, detachedFrom: string, state: string}) - `count` (integer) ## mirror.run `POST /api/v1/mirrors/run` — command, admin Pull from upstream now — one store, or every configured mirror when `repo` is empty. Input: | field | type | rules | |---|---|---| | `repo` | string | `max=64` | Output fields: - `results` (array of object {repo: string, changed: boolean, err: string}) - `failed` (integer) - `changed` (integer) ## mirror.set `POST /api/v1/mirrors` — command, admin Configure a store's upstream and pull interval. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `url` | string | `required,max=2048` | | `every` | integer | `min=0,max=604800,default=3600` | Output fields: - `mirror` (object {repo: string, url: string, every: integer, enabled: boolean, lastAt: string, lastOk: string, lastErr: string, failures: integer, acceptWrites: boolean, detachedFrom: string, state: string}) ## mirror.writes `POST /api/v1/mirrors/writes` — command, admin Allow or refuse local writes (push, tickets, wiki, forum) on a mirror. Refused by default: a write landing on a tracking store forks it by accident. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `accept` | boolean | — | Output fields: - `mirror` (object {repo: string, url: string, every: integer, enabled: boolean, lastAt: string, lastOk: string, lastErr: string, failures: integer, acceptWrites: boolean, detachedFrom: string, state: string}) ## people.list `GET /api/v1/people` — query, anonymous List contributors across every repository the caller may read. Input: | field | type | rules | |---|---|---| | `repo` | string | `max=64` | | `q` | string | `max=100` | | `offset` | integer | `min=0,max=1000000` | | `limit` | integer | `min=0,max=500,default=100` | Output fields: - `people` (array of object {user: string, events: integer, first: string, last: string, repos: array of string}) - `count` (integer) - `total` (integer) ## repo.about `GET /api/v1/r/{repo}/about` — query, anonymous The repository's About aggregate: description, homepage and topics (.quarry/repo.json), the landing page's document tabs, the latest release tag, and the contributor count. One op so the panel costs one invoke and the JSON API sees the same panel. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `doc` | string | `max=512` | Output fields: - `docPath` (string) - `docLabel` (string) - `docHtml` (string) - `description` (string) - `homepage` (string) - `topics` (array of string) - `docs` (array of object {path: string, label: string}) - `latestTag` (string) - `latestTagTip` (string) - `latestTagDate` (string) - `tagCount` (integer) - `contributors` (integer) - `licenseName` (string) - `announceRoot` (string) - `announceTitle` (string) - `announceDate` (string) - `noteEvent` (string) - `noteTitle` (string) - `noteDate` (string) - `noteUser` (string) - `noteExcerpt` (string) - `noteCount` (integer) - `problem` (string) ## repo.add `POST /api/v1/repos` — command, admin Serve a repository: an existing store at `path`, a new empty one (`create`), or a clone of `clone`. Cloning also records a mirror unless `noMirror`. Input: | field | type | rules | |---|---|---| | `name` | string | `required,max=64` | | `path` | string | `max=4096` | | `description` | string | `max=300` | | `private` | boolean | — | | `create` | boolean | — | | `clone` | string | `max=2048` | | `readme` | boolean | — | | `license` | string | `max=16` | | `ignore` | boolean | — | | `noMirror` | boolean | — | | `mirrorEvery` | integer | `min=0,max=604800` | Output fields: - `name` (string) - `path` (string) - `mirrored` (boolean) ## repo.counts `GET /api/v1/r/{repo}/counts` — query, anonymous Count a repository's content by section — what the navigation shows. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | Output fields: - `indexBehind` (boolean) - `checkins` (integer) - `wikiPages` (integer) - `tickets` (integer) - `forumThreads` (integer) - `openLandings` (integer) - `technotes` (integer) - `contributors` (integer) - `tags` (integer) ## repo.delete `POST /api/v1/repos/delete` — command, admin Destroy a repository: its store, its index and everything keyed to it. `confirm` must equal `name`. Only repositories quarry created can be deleted. Input: | field | type | rules | |---|---|---| | `name` | string | `required,max=64` | | `confirm` | string | `required,max=64` | Output fields: - `name` (string) ## repo.get `GET /api/v1/r/{repo}/info` — query, anonymous Describe one repository: its settings and headline counts. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | Output fields: - `name` (string) - `contributors` (integer) - `mirroredAt` (string) - `mirror` (object {tracking: boolean, url: string, every: integer, lastOk: string, lastAt: string, lastErr: string, failures: integer, acceptWrites: boolean, state: string}) - `detachedFrom` (string) - `deletable` (boolean) - `homepage` (string) - `topics` (string) - `fossilClone` (boolean) - `lastActive` (string) - `description` (string) - `private` (boolean) - `checkins` (integer) - `tipDate` (string) - `tipComment` (string) - `indexing` (boolean) ## repo.list `GET /api/v1/repos` — query, anonymous List the served repositories with their tip check-in. Input: | field | type | rules | |---|---|---| | `q` | string | `max=64` | | `sort` | string | `oneof=active\|name\|size` | | `limit` | integer | `min=0,max=500` | | `kind` | string | `oneof=\|mirror\|native` | Output fields: - `repos` (array of object {name: string, contributors: integer, mirroredAt: string, mirror: object {tracking: boolean, url: string, every: integer, lastOk: string, lastAt: string, lastErr: string, failures: integer, acceptWrites: boolean, state: string}, detachedFrom: string, deletable: boolean, homepage: string, topics: string, fossilClone: boolean, lastActive: string, description: string, private: boolean, checkins: integer, tipDate: string, tipComment: string, indexing: boolean}) - `count` (integer) - `total` (integer) - `served` (integer) ## repo.reindex `POST /api/v1/r/{repo}/reindex` — command, admin Wipe this repository's derived index and replay it from the store, in process, while the forge serves. The sanctioned repair for any index that disagrees with its store. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | Output fields: - `artifacts` (integer) ## repo.remove `POST /api/v1/repos/remove` — command, admin Stop serving a repository. The store on disk is left untouched. Input: | field | type | rules | |---|---|---| | `name` | string | `required,max=64` | Output fields: - `name` (string) ## repo.update `POST /api/v1/repos/update` — command, admin Set a repository's settings: description and visibility. Fields are applied whole. Input: | field | type | rules | |---|---|---| | `name` | string | `required,max=64` | | `description` | string | `max=300` | | `private` | boolean | — | | `homepage` | string | `max=300` | | `topics` | string | `max=600` | Output fields: - `name` (string) - `description` (string) - `private` (boolean) - `homepage` (string) - `topics` (string) ## search.all `GET /api/v1/search` — query, anonymous Full-text search across every repository the caller may read. Input: | field | type | rules | |---|---|---| | `q` | string | `required,max=200` | | `kind` | string | `oneof=checkin\|wiki\|ticket\|forum\|technote\|doc` | | `repo` | string | `max=64` | | `limit` | integer | `min=0,max=200,default=50` | Output fields: - `results` (array of object {repo: string, SearchResult: object {kind: string, ref: string, label: string, snippet: string}}) - `count` (integer) - `searched` (integer) - `by_repo` (array of object {repo: string, 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` | | `kind` | string | `oneof=checkin\|wiki\|ticket\|forum\|technote\|doc` | | `limit` | integer | `min=0,max=200,default=50` | Output fields: - `results` (array of object {kind: string, ref: string, label: string, snippet: string}) - `count` (integer) ## tag.list `GET /api/v1/r/{repo}/tag` — query, anonymous List release tags — symbolic names that are not branches. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `limit` | integer | `min=0,max=500,default=100` | Output fields: - `tags` (array of object {name: string, tip: string, date: 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` | | `time` | string | `max=32` | 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; rev selects one edit. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `event` | string | `required,max=64` | | `rev` | string | `max=64` | Output fields: - `event` (string) - `hash` (string) - `date` (string) - `edited` (string) - `user` (string) - `comment` (string) - `body` (string) - `html` (string) - `revisions` (integer) - `historical` (boolean) ## technote.history `GET /api/v1/r/{repo}/technote/{event}/history` — query, anonymous List every recorded edit of one technote, newest first. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `event` | string | `required,max=64` | Output fields: - `event` (string) - `comment` (string) - `edits` (array of object {hash: string, date: string, edited: string, user: string, comment: string}) - `count` (integer) ## 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, excerpt: string, revisions: integer}) - `count` (integer) ## ticket.across `GET /api/v1/me/tickets` — query, token Every tracker the caller can reach, as one listing: the same report axes as ticket.list asked of all granted repositories at once, with repository as one more browse axis. Input: | field | type | rules | |---|---|---| | `limit` | integer | `min=0,max=200,default=50` | | `state` | string | `oneof=open\|closed\|all` | | `repo` | string | `max=64` | | `type` | string | `max=64` | | `severity` | string | `max=64` | | `priority` | string | `max=64` | | `subsystem` | string | `max=64` | | `status` | string | `max=64` | | `author` | string | `max=64` | | `title` | string | `max=128` | | `order` | string | `max=32` | | `awaiting` | boolean | — | Output fields: - `tickets` (array of object {repo: string}) - `count` (integer) - `open` (integer) - `closed` (integer) - `repos` (array of object {value: string, open: integer}) - `subsystems` (array of object {value: string, open: integer}) - `authors` (array of object {value: string, open: integer}) - `truncated` (boolean) ## ticket.config `GET /api/v1/r/{repo}/ticket-config` — query, anonymous The repository's ticket vocabulary: .quarry/tickets.json at the tip of trunk, merged over fossil's defaults. List order is sort order. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | Output fields: - `vocab` (array of object {field: string, words: array of string}) - `source` (string) - `problem` (string) ## 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}, description: string, descriptionMimetype: string, comments: array of object {hash: string, date: string, login: string, username: string, mimetype: string, body: string}, changes: array of object {hash: string, date: string, user: string, fields: array of object {name: string, value: string}}}) - `descriptionHtml` (string) - `comments` (array of object {date: string, login: string, username: string, html: 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` | | `state` | string | `oneof=open\|closed\|all` | | `type` | string | `max=64` | | `severity` | string | `max=64` | | `priority` | string | `max=64` | | `subsystem` | string | `max=64` | | `status` | string | `max=64` | | `author` | string | `max=64` | | `title` | string | `max=128` | | `offset` | integer | `min=0,max=100000` | | `order` | string | `max=32` | Output fields: - `tickets` (array of object {id: string, title: string, status: string, updated: string, created: string, type: string, severity: string, priority: string, subsystem: string, resolution: string, author: string, lastUser: string, comments: integer}) - `count` (integer) - `open` (integer) - `closed` (integer) - `subsystems` (array of object {value: string, open: integer}) - `authors` (array of object {value: string, open: 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` | | `type` | string | `max=40` | | `severity` | string | `max=40` | | `priority` | string | `max=40` | | `subsystem` | string | `max=80` | | `foundin` | string | `max=80` | 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` | | `description` | string | `max=65536` | | `type` | string | `max=40` | | `severity` | string | `max=40` | | `priority` | string | `max=40` | | `subsystem` | string | `max=80` | | `foundin` | string | `max=80` | 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` | | `tag` | string | `max=64` | | `user` | 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, ci: string, commentOrig: string, hidden: boolean, closed: boolean, excerpt: string}) - `defaultBranch` (string) - `count` (integer) - `next` (string) - `indexBehind` (boolean) ## tree.list `GET /api/v1/r/{repo}/tree/{version}/{path...}` — query, anonymous List one directory of a check-in, with the directory's README rendered. Input: | field | type | rules | |---|---|---| | `repo` | string | `required,max=64` | | `version` | string | `max=100` | | `path` | string | `max=1024` | Output fields: - `version` (string) - `ref` (string) - `path` (string) - `entries` (array of object {name: string, path: string, dir: boolean, blob: string, files: integer, size: integer, exec: boolean, link: boolean, binary: boolean, lastHash: string, lastDate: string, lastComment: string}) - `readme` (string) - `readmeIn` (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) - `outline` (array of object {level: integer, id: string, text: string}) - `deleted` (boolean) ## 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, revisions: integer}) - `count` (integer) - `orphans` (array of string) - `wanted` (array of object {title: string, links: integer, from: array of string}) - `home` (string) ## 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)