ocx2-cgirelease 197a37c0d8ae (green at 2026-11-06T02:32:21Z: 713 examples, 0 failures; coverage 100.0%; 2 executables build; built with no build settings) ocx2 — OCX's tools for work on a Fossil repository.
tools
Runs, work an actor does toward an objective: send one, start one by hand, or stop one
Write a version 2 run as your user from a pattern and explicit fields, addressed by to and clone: on the server, or as a reply or ticket change pushed from a clone. Admin or setup makes an absent process user when its workspace signs in. The daemon and watcher answer it later.
capabilities needed: aR (a: admin, R: send runs) ✗
output
| name | type | required | description |
|---|---|---|---|
| run | string | yes | the run written, by its hash |
| where | object | yes | where: the thread, by its first post, or the ticket |
| where.kind | string | yes | ticket or forum |
| where.hash | string | yes | the ticket's id, or the hash of the thread's first post, in full |
| made | string | no | the user made for the run's process; absent when no account was made |
run
Start a manual run on the clone's host, using its clone and project password file.
capabilities needed: s (setup) ✗
withheld: run starts a manual run on the clone's host
ocx2 run RUN [--dry-run]
output
| name | type | required | description |
|---|---|---|---|
| run | string | yes | the run's full hash |
| handed | list of string | yes | the runs handed to a watcher |
Ask a run's actor to end it with a stop, written where the run is, as your user on the server. An actor acts only on a stop from a user holding admin or setup, or R for a run that user sent.
capabilities needed: a (admin) ✗
output
| name | type | required | description |
|---|---|---|---|
| stop | string | yes | the stop written, by its hash |
| run | string | yes | the run, by its hash in full |
attach
Join your terminal to the terminal of a run's process, at its clone's host, as the host account OCX runs as: you see what it shows and type into it, until you press Ctrl-], when you leave it running.
capabilities needed: (none)
withheld: a page holds no terminal; attach at the clone's host's command line.
ocx2 attach RUN [--dry-run]
output
| name | type | required | description |
|---|---|---|---|
| run | string | yes | the run, by its hash in full |
| joining | one of left, ended | yes | left, when you left, by Ctrl-] or as your terminal ended, the process going on; ended, when the process ended first |
Store, on the server alone, a value a run may use, such as a tunnel's key; sync never copies it. A run from a user holding admin or setup names it $$secret:NAME$$ in its process's env; the server's actor fills it in, and neither started nor kept logs show it.
capabilities needed: a (admin) ✗
output
| name | type | required | description |
|---|---|---|---|
| name | string | yes | the secret set, by its name; its value is shown nowhere |
daemon
Run this machine's clones under its service manager, pulling whole clones and handing open runs to watchers.
capabilities needed: s (setup) ✗
withheld: the daemon runs on the clone's host, under its service manager
ocx2 daemon [--dry-run]
output
| name | type | required | description |
|---|---|---|---|
| served | list of object | yes | the clones served |
| served.clone | string | yes | the clone |
| served.user | string | yes | the clone user |
| served.server_code | string | yes | the server-code |
| served.completion | integer | no | the last completed pull's receipt number |
| unapproved | list of string | yes | the entries still waiting for approval |
watch
Watch one run on this acting clone and post its reports through Fossil's pages.
capabilities needed: s (setup) ✗
withheld: watch runs on the clone's host
ocx2 watch RUN SERVER CREDENTIALS [--by-hand] [--dry-run]
output
| name | type | required | description |
|---|---|---|---|
| reports | list of string | yes | the reports posted by this watcher |
| failure | string | no | a failure of the watcher itself, with its backtrace for the run's log |
| waited | boolean | yes | whether this run waits for a later daemon round |
The checkout: read, change, test and save your work
context
Say what you are working on, first: the run's objective, if this is a run's checkout; the branch save commits on; the files changed and not saved; and the tests test may run. Then find and read files, change them with edit, run every test, and save.
capabilities needed: o (check-out) ✓
withheld: it acts on the checkout you work in, which the web page is not; call it over MCP in a run, or at a command line in a checkout
ocx2 context [--dry-run]
output
| name | type | required | description |
|---|---|---|---|
| objective | string | no | what the run is for, and what counts as passing; absent when the checkout is not a run's |
| branch | string | yes | the branch save commits your work on: never trunk |
| changed | list of object | yes | each file changed and not saved |
| changed.path | string | yes | the file, by its path from the checkout's root |
| changed.change | string | yes | how it changed: EDITED, ADDED, DELETED and so on as Fossil says, or NEW for a file Fossil does not track yet |
| tests | list of string | yes | the tests you may run, by name; save needs each to pass after your last edit |
find
Find each line holding a text, exactly as written, case and all, in the checkout's files or under one path: its file, its line number and the line. Then read the file from a little before that line.
capabilities needed: o (check-out) ✓
withheld: it acts on the checkout you work in, which the web page is not; call it over MCP in a run, or at a command line in a checkout
ocx2 find TEXT [--path PATH] [--dry-run]
output
| name | type | required | description |
|---|---|---|---|
| found | list of object | yes | each line found, at most 50 |
| found.path | string | yes | the file, by its path from the checkout's root |
| found.line | integer | yes | the line's number, from 1 |
| found.text | string | yes | the line, exactly |
| more | integer | yes | how many more lines hold it than are given; 0 when all are |
read
Read a file of the checkout: up to 200 lines from a line you name, exactly as they are, as text, with the numbers of its first and last lines and how many lines the file has. Copy what edit replaces from this text.
capabilities needed: o (check-out) ✓
withheld: it acts on the checkout you work in, which the web page is not; call it over MCP in a run, or at a command line in a checkout
ocx2 read PATH [--from FROM] [--dry-run]
output
| name | type | required | description |
|---|---|---|---|
| text | string | yes | the lines read, exactly as in the file, with no numbers added |
| first_line | integer | yes | the number of the first line in text |
| last_line | integer | yes | the number of the last line in text |
| lines | integer | yes | how many lines the file has |
edit
Change a file of the checkout: replace the text `old`, copied exactly from read's answer, with `new`. `old` must appear in the file exactly once; with `old` empty, add `new` at the file's end, making the file if there is none. It answers the changed lines as read does.
capabilities needed: i (check-in) ✗
withheld: it acts on the checkout you work in, which the web page is not; call it over MCP in a run, or at a command line in a checkout
ocx2 edit PATH OLD NEW [--dry-run]
output
| name | type | required | description |
|---|---|---|---|
| text | string | yes | the lines read, exactly as in the file, with no numbers added |
| first_line | integer | yes | the number of the first line in text |
| last_line | integer | yes | the number of the last line in text |
| lines | integer | yes | how many lines the file has |
test
Run the project's tests in the checkout as it is now, all, or one by the name the context tool lists: whether each passed, and the last 100 lines it wrote. The save tool needs every test to pass after your last edit.
capabilities needed: i (check-in) ✗
withheld: it acts on the checkout you work in, which the web page is not; call it over MCP in a run, or at a command line in a checkout
ocx2 test [--name NAME] [--dry-run]
output
| name | type | required | description |
|---|---|---|---|
| passed | boolean | yes | true when every test run passed |
| tests | list of object | yes | each test run |
| tests.name | string | yes | the test's name |
| tests.passed | boolean | yes | true when the test passed |
| tests.ended | string | yes | how it ended: exited and its code, or stopped by its wall clock |
| tests.output | string | yes | the last 100 lines it wrote to its output |
| tests.errors | string | yes | the last 100 lines it wrote to its errors |
save
Commit and push every change once every test has passed since your last edit: on your working branch, with a title and Intent, Expression and Demonstrates lines, as your user. It answers the check-in and who the server says sent it; with nothing changed, it pushes what is unsent.
capabilities needed: i (check-in) ✗
withheld: it acts on the checkout you work in, which the web page is not; call it over MCP in a run, or at a command line in a checkout
ocx2 save TITLE INTENT EXPRESSION DEMONSTRATES [--dry-run]
output
| name | type | required | description |
|---|---|---|---|
| branch | string | yes | the working branch it is on |
| checkin | string | no | the check-in made; absent when nothing had changed |
| landed | list of object | yes | the check-ins on the server, each with its link and who its receipt says sent it |
| landed.checkin | string | yes | the check-in, by its hash in full |
| landed.link | string | yes | where the server shows it |
| landed.sender | string | no | the user the server's receipt says it came from: the run's user once it landed; absent when the server has not received it, or its receipt tool could not be asked |
wiki_read
Read a wiki page as the server holds it now, by its name: its text and its version. Change it with wiki_edit.
capabilities needed: j ✓
withheld: it acts on the checkout you work in, which the web page is not; call it over MCP in a run, or at a command line in a checkout
ocx2 wiki_read NAME [--dry-run]
output
| name | type | required | description |
|---|---|---|---|
| text | string | yes | the page's text |
| version | string | yes | the version read, by its hash |
wiki_edit
Change a wiki page as edit changes a file: replace `old`, copied exactly from wiki_read's answer, with `new`; `old` must appear exactly once in the page now, so no newer change is lost. With `old` empty, append `new`, making the page if none. It answers the new text and version.
capabilities needed: k ✗
withheld: it acts on the checkout you work in, which the web page is not; call it over MCP in a run, or at a command line in a checkout
ocx2 wiki_edit NAME OLD NEW [--dry-run]
output
| name | type | required | description |
|---|---|---|---|
| text | string | yes | the page's whole text now |
| version | string | yes | the version written, by its hash |
unversioned_list
List the unversioned files the server shares, such as binaries: each name, the hash of its content and its size.
capabilities needed: o (check-out) ✓
withheld: it acts on the checkout you work in, which the web page is not; call it over MCP in a run, or at a command line in a checkout
ocx2 unversioned_list [--dry-run]
output
| name | type | required | description |
|---|---|---|---|
| files | list of object | yes | each unversioned file |
| files.name | string | yes | the file's name |
| files.hash | string | yes | the hash of its content: give it to unversioned_put as replaces, to change it |
| files.size | integer | yes | its size in bytes |
unversioned_get
Get an unversioned file the server shares, by its name: its content, base64, and the hash of its content.
capabilities needed: o (check-out) ✓
withheld: it acts on the checkout you work in, which the web page is not; call it over MCP in a run, or at a command line in a checkout
ocx2 unversioned_get NAME [--dry-run]
output
| name | type | required | description |
|---|---|---|---|
| content | string | yes | its content, base64 |
| hash | string | yes | the hash of its content |
unversioned_put
Share a file, such as a binary, as an unversioned file of the server: its name and its content, base64. To change one, give the hash you last saw, so no newer one is lost. It answers the new hash.
capabilities needed: y (write-unversioned) ✗
withheld: it acts on the checkout you work in, which the web page is not; call it over MCP in a run, or at a command line in a checkout
ocx2 unversioned_put NAME CONTENT [--replaces REPLACES] [--dry-run]
output
| name | type | required | description |
|---|---|---|---|
| hash | string | yes | the hash of the content kept |
An agent's work: sync check-ins, post answers, and record verdicts
Write a plain post as your user: a reply in the thread of the post you answer, or a change to a ticket. From your clone's checkout it is made in your clone and pushed; on the served repository, as from this page, it is made there. A reply needs Fossil's WrForum (3) or WrTForum (4), a change to a ticket its WrTkt (w) or ApndTkt (c), and Check-In (i) may make either. It refuses text that holds an OCX message, so a program's posts never carry one, and it never starts a thread or a ticket. Given for, it writes the text as a question for that user, and given run too, as the question of that run's process, yours; given decision, as your decision for the question you answer, which anyone where it is may write, and which, from its sender, or from whoever sent the run it names as asking it, confirms it answered and closes it.
capabilities needed: i34wc (i: check-in) ✗
output
| name | type | required | description |
|---|---|---|---|
| written | string | yes | the post or ticket change written, by its hash |
| where | object | yes | where: the thread, by its first post, or the ticket |
| where.kind | string | yes | ticket or forum |
| where.hash | string | yes | the ticket's id, or the hash of the thread's first post, in full |
File a new ticket as your user on the served repository, Open, with a title and a description in Markdown; it holds no OCX message, and a run, which answers where it was asked, never files one from its clone. Needs Fossil's NewTkt (n). Refused where the server holds new tickets for a moderator and you lack ModTkt (q).
capabilities needed: n ✗
output
| name | type | required | description |
|---|---|---|---|
| ticket | string | yes | the ticket, by its id |
| written | string | yes | its first change, by its hash |
Say what waits on a user, as data: each question for that user that they have not decided, whoever else has; each they sent, or a run they sent asked, that has a decision, for them to confirm answered; and every other open question, oldest first. Each with its fields, where it was asked, who sent it and when, what it replies to and what it refers to described, its decisions, and who may confirm it. From a clone's checkout it asks the server who sent each question and decision. It writes nothing.
capabilities needed: 2r ✓
output
| name | type | required | description |
|---|---|---|---|
| for | string | yes | the user whose questions they are, by login |
| waiting | list of object | yes | what waits on them: each question for them that they have not decided, whoever else has, oldest first |
| waiting.asked | string | yes | the post or ticket change asking it, by its hash in full, which a decision names |
| waiting.where | object | yes | the thread or ticket it is in |
| waiting.where.kind | string | yes | ticket or forum |
| waiting.where.hash | string | yes | the ticket's id, or the hash of the thread's first post, in full |
| waiting.title | string | yes | that thread's or ticket's title, each hash in it shown by its artifact's title, or cut |
| waiting.link | string | yes | where it was asked, as a link from the repository's root by the first ten digits of a hash: the post, or its ticket |
| waiting.url | string | no | that link in full, from the server's public URL; absent where none is set |
| waiting.from | string | no | the user the server received it from; absent when it kept none |
| waiting.at | string | yes | when it was written, in UTC, as its writer's clock said |
| waiting.for | string | yes | the user it asks, by login |
| waiting.question | string | yes | what it asks, in words |
| waiting.options | list of string (choice) | yes | its options, the one its asker recommends first; none for the user's own words |
| waiting.stakes | string | no | what the decision changes; absent when not said |
| waiting.run | string | no | the run whose process asks it, by its hash in full; absent when no run's process asks it |
| waiting.replies_to | object | no | what it replies to, described: the post, or its ticket; absent for a thread's first post |
| waiting.replies_to.title | string | yes | its title: a thread's, a ticket's, a tech-note's comment, a check-in's first comment line, a file's name and lines, or a page's name, each hash in it shown by its artifact's title, or cut to "…" when none is found; or "not readable by you", or "not in the repository" |
| waiting.replies_to.kind | string | no | what it is: forum, ticket, technote, checkin, file or wiki; absent where it is not shown |
| waiting.replies_to.by | string | no | the user the server received it from; for a ticket, its first change's |
| waiting.replies_to.at | string | no | when it was written, in UTC, as its writer's clock said |
| waiting.replies_to.excerpt | string | no | what it says: its first 300 characters, an OCX message's block left out, or the file's lines, at most 20; each hash in it shown by its artifact's title, or cut to "…" when none is found |
| waiting.replies_to.link | string | yes | the link, from the repository's root |
| waiting.replies_to.url | string | no | the link in full, from the repository's public URL; absent where none is set, or the link is not from the repository's root |
| waiting.references | list of object | yes | what it refers to, each reference described, in its order |
| waiting.references.title | string | yes | its title: a thread's, a ticket's, a tech-note's comment, a check-in's first comment line, a file's name and lines, or a page's name, each hash in it shown by its artifact's title, or cut to "…" when none is found; or "not readable by you", or "not in the repository" |
| waiting.references.kind | string | no | what it is: forum, ticket, technote, checkin, file or wiki; absent where it is not shown |
| waiting.references.by | string | no | the user the server received it from; for a ticket, its first change's |
| waiting.references.at | string | no | when it was written, in UTC, as its writer's clock said |
| waiting.references.excerpt | string | no | what it says: its first 300 characters, an OCX message's block left out, or the file's lines, at most 20; each hash in it shown by its artifact's title, or cut to "…" when none is found |
| waiting.references.link | string | yes | the link, from the repository's root |
| waiting.references.url | string | no | the link in full, from the repository's public URL; absent where none is set, or the link is not from the repository's root |
| waiting.decisions | list of object | yes | each decision that counts, oldest first |
| waiting.decisions.from | string | no | the user the server received it from; absent when it kept none |
| waiting.decisions.at | string | yes | when it was written, in UTC, as its writer's clock said |
| waiting.decisions.note | string | yes | its note: its writer's words, or the words of the option chosen, each hash in it shown by its artifact's title, or cut to "…" when none is found |
| waiting.confirmers | list of string | yes | who may confirm it answered, by login: its sender, and who sent the run it names as asking it, when that run counts; none when the server kept no sender for it |
| to_confirm | list of object | yes | each question they sent, or a run they sent asked, that has a decision, for them to confirm answered, oldest first |
| to_confirm.asked | string | yes | the post or ticket change asking it, by its hash in full, which a decision names |
| to_confirm.where | object | yes | the thread or ticket it is in |
| to_confirm.where.kind | string | yes | ticket or forum |
| to_confirm.where.hash | string | yes | the ticket's id, or the hash of the thread's first post, in full |
| to_confirm.title | string | yes | that thread's or ticket's title, each hash in it shown by its artifact's title, or cut |
| to_confirm.link | string | yes | where it was asked, as a link from the repository's root by the first ten digits of a hash: the post, or its ticket |
| to_confirm.url | string | no | that link in full, from the server's public URL; absent where none is set |
| to_confirm.from | string | no | the user the server received it from; absent when it kept none |
| to_confirm.at | string | yes | when it was written, in UTC, as its writer's clock said |
| to_confirm.for | string | yes | the user it asks, by login |
| to_confirm.question | string | yes | what it asks, in words |
| to_confirm.options | list of string (choice) | yes | its options, the one its asker recommends first; none for the user's own words |
| to_confirm.stakes | string | no | what the decision changes; absent when not said |
| to_confirm.run | string | no | the run whose process asks it, by its hash in full; absent when no run's process asks it |
| to_confirm.replies_to | object | no | what it replies to, described: the post, or its ticket; absent for a thread's first post |
| to_confirm.replies_to.title | string | yes | its title: a thread's, a ticket's, a tech-note's comment, a check-in's first comment line, a file's name and lines, or a page's name, each hash in it shown by its artifact's title, or cut to "…" when none is found; or "not readable by you", or "not in the repository" |
| to_confirm.replies_to.kind | string | no | what it is: forum, ticket, technote, checkin, file or wiki; absent where it is not shown |
| to_confirm.replies_to.by | string | no | the user the server received it from; for a ticket, its first change's |
| to_confirm.replies_to.at | string | no | when it was written, in UTC, as its writer's clock said |
| to_confirm.replies_to.excerpt | string | no | what it says: its first 300 characters, an OCX message's block left out, or the file's lines, at most 20; each hash in it shown by its artifact's title, or cut to "…" when none is found |
| to_confirm.replies_to.link | string | yes | the link, from the repository's root |
| to_confirm.replies_to.url | string | no | the link in full, from the repository's public URL; absent where none is set, or the link is not from the repository's root |
| to_confirm.references | list of object | yes | what it refers to, each reference described, in its order |
| to_confirm.references.title | string | yes | its title: a thread's, a ticket's, a tech-note's comment, a check-in's first comment line, a file's name and lines, or a page's name, each hash in it shown by its artifact's title, or cut to "…" when none is found; or "not readable by you", or "not in the repository" |
| to_confirm.references.kind | string | no | what it is: forum, ticket, technote, checkin, file or wiki; absent where it is not shown |
| to_confirm.references.by | string | no | the user the server received it from; for a ticket, its first change's |
| to_confirm.references.at | string | no | when it was written, in UTC, as its writer's clock said |
| to_confirm.references.excerpt | string | no | what it says: its first 300 characters, an OCX message's block left out, or the file's lines, at most 20; each hash in it shown by its artifact's title, or cut to "…" when none is found |
| to_confirm.references.link | string | yes | the link, from the repository's root |
| to_confirm.references.url | string | no | the link in full, from the repository's public URL; absent where none is set, or the link is not from the repository's root |
| to_confirm.decisions | list of object | yes | each decision that counts, oldest first |
| to_confirm.decisions.from | string | no | the user the server received it from; absent when it kept none |
| to_confirm.decisions.at | string | yes | when it was written, in UTC, as its writer's clock said |
| to_confirm.decisions.note | string | yes | its note: its writer's words, or the words of the option chosen, each hash in it shown by its artifact's title, or cut to "…" when none is found |
| to_confirm.confirmers | list of string | yes | who may confirm it answered, by login: its sender, and who sent the run it names as asking it, when that run counts; none when the server kept no sender for it |
| open | list of object | yes | every other question still open, their own that no one has decided among them, oldest first |
| open.asked | string | yes | the post or ticket change asking it, by its hash in full, which a decision names |
| open.where | object | yes | the thread or ticket it is in |
| open.where.kind | string | yes | ticket or forum |
| open.where.hash | string | yes | the ticket's id, or the hash of the thread's first post, in full |
| open.title | string | yes | that thread's or ticket's title, each hash in it shown by its artifact's title, or cut |
| open.link | string | yes | where it was asked, as a link from the repository's root by the first ten digits of a hash: the post, or its ticket |
| open.url | string | no | that link in full, from the server's public URL; absent where none is set |
| open.from | string | no | the user the server received it from; absent when it kept none |
| open.at | string | yes | when it was written, in UTC, as its writer's clock said |
| open.for | string | yes | the user it asks, by login |
| open.question | string | yes | what it asks, in words |
| open.options | list of string (choice) | yes | its options, the one its asker recommends first; none for the user's own words |
| open.stakes | string | no | what the decision changes; absent when not said |
| open.run | string | no | the run whose process asks it, by its hash in full; absent when no run's process asks it |
| open.replies_to | object | no | what it replies to, described: the post, or its ticket; absent for a thread's first post |
| open.replies_to.title | string | yes | its title: a thread's, a ticket's, a tech-note's comment, a check-in's first comment line, a file's name and lines, or a page's name, each hash in it shown by its artifact's title, or cut to "…" when none is found; or "not readable by you", or "not in the repository" |
| open.replies_to.kind | string | no | what it is: forum, ticket, technote, checkin, file or wiki; absent where it is not shown |
| open.replies_to.by | string | no | the user the server received it from; for a ticket, its first change's |
| open.replies_to.at | string | no | when it was written, in UTC, as its writer's clock said |
| open.replies_to.excerpt | string | no | what it says: its first 300 characters, an OCX message's block left out, or the file's lines, at most 20; each hash in it shown by its artifact's title, or cut to "…" when none is found |
| open.replies_to.link | string | yes | the link, from the repository's root |
| open.replies_to.url | string | no | the link in full, from the repository's public URL; absent where none is set, or the link is not from the repository's root |
| open.references | list of object | yes | what it refers to, each reference described, in its order |
| open.references.title | string | yes | its title: a thread's, a ticket's, a tech-note's comment, a check-in's first comment line, a file's name and lines, or a page's name, each hash in it shown by its artifact's title, or cut to "…" when none is found; or "not readable by you", or "not in the repository" |
| open.references.kind | string | no | what it is: forum, ticket, technote, checkin, file or wiki; absent where it is not shown |
| open.references.by | string | no | the user the server received it from; for a ticket, its first change's |
| open.references.at | string | no | when it was written, in UTC, as its writer's clock said |
| open.references.excerpt | string | no | what it says: its first 300 characters, an OCX message's block left out, or the file's lines, at most 20; each hash in it shown by its artifact's title, or cut to "…" when none is found |
| open.references.link | string | yes | the link, from the repository's root |
| open.references.url | string | no | the link in full, from the repository's public URL; absent where none is set, or the link is not from the repository's root |
| open.decisions | list of object | yes | each decision that counts, oldest first |
| open.decisions.from | string | no | the user the server received it from; absent when it kept none |
| open.decisions.at | string | yes | when it was written, in UTC, as its writer's clock said |
| open.decisions.note | string | yes | its note: its writer's words, or the words of the option chosen, each hash in it shown by its artifact's title, or cut to "…" when none is found |
| open.confirmers | list of string | yes | who may confirm it answered, by login: its sender, and who sent the run it names as asking it, when that run counts; none when the server kept no sender for it |
Answer a project's card/NAME wiki definition across the named repositories, as data. Reads only.
capabilities needed: o (check-out) ✓
output
| name | type | required | description |
|---|---|---|---|
| project | string | yes | the repository project defining the card |
| name | string | yes | the card's wiki name after card/ |
| title | string | yes | the card's title |
| as_of | string | no | the newest check-in, forum post or ticket event in any named repository, UTC |
| count | integer | yes | the number of items found before the limit |
| say | string | yes | the rendered sentence |
| items | list of table of string | yes | each selected item, with its project |
Answer every card/NAME wiki definition in the named repositories. Reads only.
capabilities needed: o (check-out) ✓
output
| name | type | required | description |
|---|---|---|---|
| as_of | string | no | the newest check-in, forum post or ticket event in any named repository, UTC |
| cards | list of object | yes | each card's project, name, title, count and sentence |
| cards.project | string | yes | the repository project defining the card |
| cards.name | string | yes | the card's wiki name after card/ |
| cards.title | string | yes | the card's title |
| cards.count | integer | yes | the number of items found before the limit |
| cards.say | string | yes | the rendered sentence |
Say who sent each artifact: the user the server received it from, what that user may do there, and the order in which the server received it, or that it has not; or what one user may do, and whether the wiki edits they save, and the ticket changes they make in its ticket pages, wait for a moderator. Never an IP address. From a clone it asks the server.
capabilities needed: (none)
output
| name | type | required | description |
|---|---|---|---|
| artifacts | list of object | yes | each artifact asked of, in the order asked |
| artifacts.artifact | string | yes | the artifact, by its hash in full |
| artifacts.received | boolean | yes | whether the server has received it; false too for one you may not read |
| artifacts.sender | string | no | the user the server received it from; absent when it has not received it, or kept no user for it |
| artifacts.capabilities | string (fossil-capabilities) | no | what that user may do on the server, as Fossil grants it, inherited capabilities included |
| artifacts.receipt | integer | no | the number of the server's receipt, which orders what it received |
| artifacts.rid | integer | no | the artifact's row number on the server, which orders the artifacts of one receipt |
| user | object | no | the user asked of; absent when none was |
| user.user | string | yes | the user |
| user.capabilities | string (fossil-capabilities) | no | what the user may do on the server, as Fossil grants it; absent when the server has no such user, or you may not read |
| user.wiki_moderated | boolean | no | whether the server holds each wiki edit the user saves for a moderator: it moderates wiki edits, and the user lacks ModWiki (l); absent as capabilities is |
| user.ticket_moderated | boolean | no | whether the server holds each ticket change the user makes in its ticket pages for a moderator: it moderates ticket changes, and the user lacks ModTkt (q); absent as capabilities is |
| asked | string | no | the server asked, from a clone, by its URL: it answers as to anyone, so what anyone may not read reads as not received; absent on the served repository |
Record a verdict on a check-in: tag it audited with pass or fail, a note, and the objective it was judged against, as your user (docs/protocol-v2-verdicts.md). No one may audit their own check-in. From a clone, the tag is pushed; either way, the verdict is then read back from the served repository, so a verdict Fossil did not keep is never reported as given.
capabilities needed: i (check-in) ✗
output
| name | type | required | description |
|---|---|---|---|
| checkin | string | yes | the check-in, in full |
| tag | string | yes | the tag's artifact |
| held | string | yes | the verdict as the served repository holds it: pass or fail, a colon, the note, and (against X) |
| by | string | no | the user Fossil received the verdict from |
List the check-ins that change files and that no verdict that counts has judged (docs/protocol-v2-verdicts.md): on one branch or every branch, oldest first in the order the server received them, at most 50, with how many there are. From a clone's checkout it asks the server. It writes nothing.
capabilities needed: (none)
output
| name | type | required | description |
|---|---|---|---|
| checkins | list of object | yes | the check-ins no verdict that counts has judged, oldest first, at most 50 |
| checkins.checkin | string | yes | the check-in, by its hash in full |
| checkins.branch | string | no | its branch, as Fossil's timeline shows it |
| checkins.user | string | no | the user it names, as its writer gave it |
| checkins.comment | string | no | its comment, as the timeline shows it |
| count | integer | yes | how many there are, those not given included |
| asked | string | no | the server asked, from a clone, by its URL; absent on the served repository |
For an agent outside every run's checkout that keeps no Fossil password: push your clone's check-ins by giving a base64 bundle of your working branch, each comment with Intent, Expression and Demonstrates lines; checked, they are pushed as the user of the run whose process answers this call. Give have, a check-in you hold, for later ones. In a run's checkout, on any host? Your commits push as you make them; if one did not, run `fossil push`.
capabilities needed: i (check-in) ✗
output
| name | type | required | description |
|---|---|---|---|
| pushed | list of string | yes | the check-ins pushed to the server, by their hashes as the bundle lists them |
| landed | list of object | yes | each check-in pushed, as the server holds it: its hash in full, its link, and who the server's receipt says sent it |
| landed.checkin | string | yes | the check-in, by its hash in full |
| landed.link | string | yes | where the server shows it |
| landed.sender | string | no | the user the server's receipt says it came from: the run's user once it landed; absent when the server has not received it, or its receipt tool could not be asked |
| bundle | string | no | every check-in after the one you hold, as a bundle, base64; absent without have, or when none follows it |
| apply | string | no | how to apply the bundle in your clone |
For an agent outside every run's checkout that keeps no Fossil password: say, as shell commands, how to commit your own clone's work and get it to the server: check you are on your working branch, commit with the comment this writes from what you give, bundle the branch, and give it to sync. In a run's checkout, on any host? Your commits push as you make them; if one did not, run `fossil push`.
capabilities needed: (none)
output
| name | type | required | description |
|---|---|---|---|
| message | string | yes | the check-in's comment, filled from what you gave |
| steps | list of string | yes | the steps, each a command for your own shell or a call to make |
commit_and_sync
For an agent outside every run's checkout that keeps no Fossil password, from ocx2 --mcp on its own machine: commit every change in your own clone once every test has passed since your last edit, new files included, on your working branch, with a title and Intent, Expression and Demonstrates lines; answer the branch's bundle for sync. Elsewhere it points to commit_and_sync_guide. In a run's checkout, on any host? Your commits push as you make them; if one did not, run `fossil push`.
capabilities needed: i (check-in) ✗
withheld: it acts on your own checkout, which the web page is not where; see commit_and_sync_guide
ocx2 commit_and_sync BRANCH TITLE INTENT EXPRESSION DEMONSTRATES [--dry-run]
output
| name | type | required | description |
|---|---|---|---|
| committed | string | yes | the check-in made, by its hash |
| bundle | string | yes | the branch, as a bundle, base64, for ocx_sync's bundle |
| next_call | string | yes | the call to make next |
thread
Read a thread or a ticket, named by the hash, or a prefix of it, of any of its posts or changes, such as your run's: each post or change, oldest first in the order the server received them, with who sent it, when and its text; at most 20, after the one you give. From your clone's checkout it pulls first. It writes nothing.
capabilities needed: o (check-out) ✓
withheld: Fossil's own forum and ticket pages show a thread and a ticket's changes; read them there.
ocx2 thread OF [--after AFTER] [--dry-run]
output
| name | type | required | description |
|---|---|---|---|
| where | object | yes | where: the thread, by its first post, or the ticket |
| where.kind | string | yes | ticket or forum |
| where.hash | string | yes | the ticket's id, or the hash of the thread's first post, in full |
| conversation | string | no | the name a person gave the thread with ocx-console's menu, as it is now; absent when it has none, and for a ticket |
| posts | list of object | yes | each post or change, oldest first, at most 20 |
| posts.hash | string | yes | the post or change, by its hash in full; give it as after to read what follows it |
| posts.from | string | no | who sent it: the user the server received it from; absent for one received from no user it keeps, and for one the server has not received, a write in your clone not pushed yet, which comes last |
| posts.when | string | yes | when it was written, in UTC, as its writer's clock said |
| posts.text | string | yes | its text, in Markdown, an OCX message's block included |
| more | integer | yes | how many more follow than are given; 0 when all are, else read on with after the last hash given |
The repository and its actor
Install Fossil's own git export as the after-receive hook, replacing any old ocx2-hook command.
capabilities needed: s (setup) ✗
What hook would do now
Worked out when this page loaded: the checks ran; the changes have not been made.
- check
read_hookread Fossil's export hook, other after-receive programs, backoffice settings and the timeline chat user · repository /var/lib/fossil/cleave.fossil
stops nobody lacks what hook needs: any of the Fossil capabilities s (setup); it holds ghjorz (g: clone, o: check-out)
output
| name | type | required | description |
|---|---|---|---|
| outcome | one of installed, replaced, unchanged | yes | installed; replaced, when a hook run with another command, or more than once, was deleted first; or unchanged, when the repository already ran it as this root installs it |
| hook | object | yes | where the hook stands now, read back |
| hook.state | one of installed, other, absent | yes | installed once as Fossil's export; other when an old or repeated hook remains; absent otherwise |
| hook.command | string | no | the installed command, when present |
| hook.others | list of string | yes | the other after-receive programs |
| hook.backoffice | one of queued, nodelay, disabled | yes | when Fossil runs its backoffice |
| hook.chat_user | string | no | the chat user naming timeline events, when configured |
Remove Fossil's export hook and any old ocx2-hook command, leaving every other hook.
capabilities needed: s (setup) ✗
What unhook would do now
Worked out when this page loaded: the checks ran; the changes have not been made.
- check
read_hookread Fossil's export hook, other after-receive programs, backoffice settings and the timeline chat user · repository /var/lib/fossil/cleave.fossil - change
delete_hooksdelete Fossil's export command and any old ocx2-hook command, leaving other hooks · repository /var/lib/fossil/cleave.fossil
stops nobody lacks what unhook needs: any of the Fossil capabilities s (setup); it holds ghjorz (g: clone, o: check-out)
output
| name | type | required | description |
|---|---|---|---|
| outcome | one of removed, absent | yes | removed; or absent, when the repository did not run it |
| hook | object | yes | where the hook stands now, read back |
| hook.state | one of installed, other, absent | yes | installed once as Fossil's export; other when an old or repeated hook remains; absent otherwise |
| hook.command | string | no | the installed command, when present |
| hook.others | list of string | yes | the other after-receive programs |
| hook.backoffice | one of queued, nodelay, disabled | yes | when Fossil runs its backoffice |
| hook.chat_user | string | no | the chat user naming timeline events, when configured |
Bring the server's git export, the git repository Fossil writes from it, up to date. One export runs at a time: asking during one makes it run once more after. OCX's hook does this whenever a check-in arrives. A dry run only says where the export stands.
capabilities needed: s (setup) ✗
What export would do now
Worked out when this page loaded: the checks ran; the changes have not been made.
- check
find_exportfind the repository's git export where its last-git-export-repo setting says, and read where it stands, as fossil git status says, with OCX's last run of it · repository /var/lib/fossil/cleave.fossil - change
export_to_gitexport the check-ins waiting, with fossil git export, one run at a time: while another run holds the export, ask it to export again instead; it exports until no run asks · mirror /var/lib/ollama-codex/git-mirror/cleave · awaiting 0 · autopush off
stops nobody lacks what export needs: any of the Fossil capabilities s (setup); it holds ghjorz (g: clone, o: check-out)
output
| name | type | required | description |
|---|---|---|---|
| ran | object | no | this export's run; absent when another run held the export and was asked to export again |
| ran.when | string | yes | when it began, in UTC |
| ran.took_ms | number | yes | how long it took, in milliseconds, with the exports it made again |
| ran.runs | integer | yes | how many times it exported: once, and again for each run asked for while it did |
| ran.added | list of integer | no | the check-ins Fossil said it added, by export; absent when an export failed |
| ran.failure | string | no | why it failed, as Fossil said; absent when it did not |
| state | object | yes | where the export stands after it |
| state.mirror | string | yes | the export's directory |
| state.awaiting | integer | no | how many check-ins wait to be exported; absent when Fossil cannot say |
| state.unreadable | string | no | why Fossil cannot say where the export stands, as when an export was killed before Fossil kept anything; the next export mends it |
| state.last_export | string | no | when Fossil last exported, as it says; absent before its first |
| state.autopush | string | no | where Fossil pushes after each export, or off; set only by `fossil git export --autopush` |
| state.main_branch | string | no | the git branch Fossil's trunk is exported as |
| state.last | object | no | OCX's last run of it; absent before its first |
| state.last.when | string | yes | when it began, in UTC |
| state.last.took_ms | number | yes | how long it took, in milliseconds, with the exports it made again |
| state.last.runs | integer | yes | how many times it exported: once, and again for each run asked for while it did |
| state.last.added | list of integer | no | the check-ins Fossil said it added, by export; absent when an export failed |
| state.last.failure | string | no | why it failed, as Fossil said; absent when it did not |
Make a served repository, empty or from git, with its export, hook, ticket fields, clone and process users ready. The running daemon makes its clone within a minute. The web page runs it detached.
capabilities needed: s (setup) ✗
output
| name | type | required | description |
|---|---|---|---|
| repository | string | yes | the new repository |
| mirror | string | yes | its git export |
| checkins | integer | no | how many check-ins it starts with, each the upstream's own commit in its export; absent while it goes on detached |
| main_branch | string | no | the git branch its trunk exports as, the upstream's own; absent while it goes on detached |
| hook | string | no | the hook's command on it; absent when this release's hook is not installed on the served repository |
| url | string | no | its public URL, set as its email-url, which a run's clone is made from (HISTORY.md decision 25): the served repository's with its name; absent when that has none, and then its administrator sets it |
| login_group | string | no | the login group it shares with the served repository, so signing in to either signs in to the other, for a user both have: the caller, its admin; absent while it goes on detached |
| detached | object | no | from the web page, the import going on, detached, so the page answers at once: its process, and where it writes its outcome once it ends, which status shows; absent at the command line, which answers once it ends |
| detached.pid | integer | yes | the process importing, by its number on this host, which status lists while it runs |
| detached.log | string | yes | the import log, in which it writes its outcome as one line once it ends, which status shows |
| detached.output | string | yes | its own output: its answer as JSON, each operation it did, once it ends |
| next | string | yes | the one step to make the daemon's clone |
Tag every OCX message the repository holds that lacks its ocx-message tag, or carries a wrong value, in one control artifact, as your user, as the actor's check does: on the served repository, or from your clone's checkout, pulled first and pushed after. It needs Fossil's Check-In (i), answers what it tagged, by kind, and decides nothing about any run.
capabilities needed: i (check-in) ✗
What tag_messages would do now
Worked out when this page loaded: the checks ran; the changes have not been made.
- change
tag_untaggedread every post and ticket change holding an OCX message, as the actor's check reads them, and tag each that lacks the ocx-message tag, or carries another value, in one control artifact, as the caller: on the served repository, or in the caller's clone and pushed · user nobody
stops nobody lacks what tag_messages needs: any of the Fossil capabilities i (check-in); it holds ghjorz (g: clone, o: check-out)
output
| name | type | required | description |
|---|---|---|---|
| tagged | list of object | yes | each kind of message tagged, with the artifacts tagged as holding one, by kind; empty when every message carried its tag |
| tagged.kind | string | yes | the messages' kind, as the first word of their tag's value says: run, stop, started, ended or another the protocol names |
| tagged.artifacts | list of string | yes | each artifact tagged as holding one, by its hash in full |
Logins: ask for one, approve it, collect its password, or let one send runs
Approve a login someone asked for, with one press: open only a link the asker printed itself. It makes that user holding exactly the capabilities the link asks, never admin or setup, with a password no page shows, which the asker may collect with its code.
capabilities needed: a (admin) ✗
output
| name | type | required | description |
|---|---|---|---|
| login | string | yes | the login approved |
| capabilities | string (fossil-capabilities) | yes | the capabilities it holds |
Give the asker of an approved login its password, for the code whose SHA-256 its link gave, which only the asker holds; or, without a code, to a signed-in login the password is approved for. Register sends the code in a POST's body, never in a URL. It needs no capability and changes nothing.
capabilities needed: (none)
output
| name | type | required | description |
|---|---|---|---|
| login | string | yes | the login |
| password | string | yes | its password |
register
Ask the server for a login, from your own machine: the first call makes a code, keeps it in your file of passwords and prints a link for an admin to approve; once approved, a call collects the password into the file in place of the code.
capabilities needed: (none)
withheld: register is called on the asker's own machine, which keeps its file of passwords, from its command line.
ocx2 register SERVER CREDENTIALS [--login LOGIN] [--capabilities CAPABILITIES] [--dry-run]
output
| name | type | required | description |
|---|---|---|---|
| login | string | yes | the login |
| password | one of collected, held | yes | collected, when this call collected the password and kept it in place of the code; or held, when the file held it already |
Make the key a connector, such as claude.ai's, reaches this repository's MCP with, acting as one login once a login holding setup approves it through OAuth, and show its URL once; or revoke it. A login holding admin or setup is refused. Each call acts with the login's capabilities as Fossil holds them then, and lists only status, questions, thread, post, ticket.
capabilities needed: s (setup) ✗
output
| name | type | required | description |
|---|---|---|---|
| login | string | yes | the login the key acts as |
| url | string | no | the URL to give the connector, shown this once, holding the key; absent when revoked |
Let a user of the served repository send runs, and stop the runs it sent: add R to the letters it holds, or with off take R away, in one write that leaves every other letter as it is, and say what it may do then. An actor takes a run from a user holding R alone within the run isolation rules.
capabilities needed: a (admin) ✗
output
| name | type | required | description |
|---|---|---|---|
| user | string | yes | the user |
| capabilities | string (fossil-capabilities) | yes | what the user may do on the served repository now, as Fossil grants it, inherited capabilities included, as receipt reads it |
| note | string | no | what R does not say of this user: that it holds admin or setup, which send any run with or without R; or, R taken away, that Fossil's own users lend it R still; absent otherwise |
Releases: stage, accept or roll back
stage
Check, build and stage a release: run a committed Fossil checkout's own checks (crystal run ci.cr), build its programs (shards build), copy them into the release root's staged/, named by the check-in's first twelve hex digits, smoke each, and offer the release as next. Nothing served changes until accept.
capabilities needed: s (setup) ✗
withheld: it runs the checkout's own code as the web server's account; run it from the command line or MCP.
ocx2 stage CHECKOUT [--root ROOT] [--dry-run]
output
| name | type | required | description |
|---|---|---|---|
| release | string | yes | the release's name: the first twelve hex digits of its check-in |
| programs | list of string | yes | the programs released |
| gate | string | yes | the gate's note: when it was green, the spec summary and the build settings |
| releases | object | yes | what the release root serves and offers now |
| releases.current | string (check-in) | no | the release served, the active release candidate, which ocx2-cgi runs; absent if none |
| releases.previous | string (check-in) | no | the release served before it, which rollback serves again; absent if none |
| releases.next | string (check-in) | no | the release offered as next, the pre-release candidate, which ocx2-cgi-next runs; absent if none |
| releases.changes | string (changes) | no | what the tool changed, from the release it replaced to current, after accept, rollback or follow; else what next changes from current, while another release is offered; absent unless both are named |
Serve the pre-release candidate (staged/next in the release root) as the active release candidate (current); what was served becomes previous. Only a user holding setup may; called as the pre-release candidate's page, ocx2-cgi-next, it accepts only a first release, while none is served.
capabilities needed: s (setup) ✗
What accept would do now
Worked out when this page loaded: the checks ran; the changes have not been made.
- check
find_offeredfind the release the staged area offers as next, unless it is already served · root /var/lib/ocx/agents-daemon
stops nobody lacks what accept needs: any of the Fossil capabilities s (setup); it holds ghjorz (g: clone, o: check-out); next is 197a37c0d8ae, which is served already
output
| name | type | required | description |
|---|---|---|---|
| current | string (check-in) | no | the release served, the active release candidate, which ocx2-cgi runs; absent if none |
| previous | string (check-in) | no | the release served before it, which rollback serves again; absent if none |
| next | string (check-in) | no | the release offered as next, the pre-release candidate, which ocx2-cgi-next runs; absent if none |
| changes | string (changes) | no | what the tool changed, from the release it replaced to current, after accept, rollback or follow; else what next changes from current, while another release is offered; absent unless both are named |
Serve the previous release again as the active release candidate; a second rollback undoes the first. Both pages, ocx2-cgi and ocx2-cgi-next, roll back.
capabilities needed: s (setup) ✗
What rollback would do now
Worked out when this page loaded: the checks ran; the changes have not been made.
- check
find_previousfind the release the root served before the current one · root /var/lib/ocx/agents-daemon - change
roll_backserve the previous release again, which ocx2-cgi then runs, keeping the release it replaces as previous · root /var/lib/ocx/agents-daemon · name 0397ade7223b · replaces 197a37c0d8ae
stops nobody lacks what rollback needs: any of the Fossil capabilities s (setup); it holds ghjorz (g: clone, o: check-out)
output
| name | type | required | description |
|---|---|---|---|
| current | string (check-in) | no | the release served, the active release candidate, which ocx2-cgi runs; absent if none |
| previous | string (check-in) | no | the release served before it, which rollback serves again; absent if none |
| next | string (check-in) | no | the release offered as next, the pre-release candidate, which ocx2-cgi-next runs; absent if none |
| changes | string (changes) | no | what the tool changed, from the release it replaced to current, after accept, rollback or follow; else what next changes from current, while another release is offered; absent unless both are named |
Count a builder's stage run by the server's receipts, check its files, copy and smoke it, and offer it as next; remove the shared files.
capabilities needed: s (setup) ✗
output
| name | type | required | description |
|---|---|---|---|
| current | string (check-in) | no | the release served, the active release candidate, which ocx2-cgi runs; absent if none |
| previous | string (check-in) | no | the release served before it, which rollback serves again; absent if none |
| next | string (check-in) | no | the release offered as next, the pre-release candidate, which ocx2-cgi-next runs; absent if none |
| changes | string (changes) | no | what the tool changed, from the release it replaced to current, after accept, rollback or follow; else what next changes from current, while another release is offered; absent unless both are named |
Read current and previous, their names and SHA-256 inventories; read a listed file of either release, base64. Only a signed-in setup login or a listed builder may read.
capabilities needed: (none)
output
| name | type | required | description |
|---|---|---|---|
| current | object | no | current's name and files; null when none |
| current.name | string | yes | the release name, its check-in's recorded abbreviation |
| current.files | table of string | yes | every file in release.txt, by name with its SHA-256 from that inventory |
| previous | object | no | previous's name and files; null when none |
| previous.name | string | yes | the release name, its check-in's recorded abbreviation |
| previous.files | table of string | yes | every file in release.txt, by name with its SHA-256 from that inventory |
| content | string | no | the requested file's exact bytes, base64; absent when listing releases |
follow
Run the server's accepted current release on this client, keeping the release it leaves as previous. Start the daemon again with confine daemon after current moves.
capabilities needed: (none)
withheld: follow runs inside the client's root, as its owner, from the command line
ocx2 follow SERVER [--root ROOT] [--dry-run]
output
| name | type | required | description |
|---|---|---|---|
| releases | object | yes | the client's release links |
| releases.current | string (check-in) | no | the release served, the active release candidate, which ocx2-cgi runs; absent if none |
| releases.previous | string (check-in) | no | the release served before it, which rollback serves again; absent if none |
| releases.next | string (check-in) | no | the release offered as next, the pre-release candidate, which ocx2-cgi-next runs; absent if none |
| releases.changes | string (changes) | no | what the tool changed, from the release it replaced to current, after accept, rollback or follow; else what next changes from current, while another release is offered; absent unless both are named |
| note | string | yes | whether current moved, or was already the server's current |
Name the stage pattern and the builder whose runs may be imported as releases of this repository's program APP, which the page then serves at ext/ocx2-cgi/app/APP once one is accepted; import, accept and rollback given --app release it as they release OCX. The builder gets y (write unversioned) on this repository, to send its runs' files. Only a user holding setup may.
capabilities needed: s (setup) ✗
output
| name | type | required | description |
|---|---|---|---|
| root | string | yes | the app's release root |
About this program
List every tool: what it does, who may run it, whether this entry point offers it, and the shape of its input; and, for a tool that changes something and needs no input, what a dry run of it says now. This list is what runs when no tool is named, and what MCP's tools/list gives.
capabilities needed: (none)
output
| name | type | required | description |
|---|---|---|---|
| program | string | yes | the program |
| about | string | yes | what it is |
| tools | list of object | yes | every tool: what it does, who may run it, and the shape of a call to it |
| tools.name | string | yes | the tool's name |
| tools.summary | string | yes | what it does |
| tools.group | string | yes | the group it is listed in |
| tools.capabilities_needed | string (fossil-capabilities) | yes | the Fossil capabilities, any one of which lets a user run it; none when anyone may |
| tools.withheld | string | no | why this entry point does not offer it; absent when it does |
| tools.defined_in | string | yes | where it is defined: its source file, from the checkout's root, and the line that declares it |
| tools.input | object | yes | the shape of its input: what a call gives it |
| tools.output | object | no | the shape of its output, an answer's result (help) |
| tools.dry_run_now | object | no | what a dry run of it with no input says now, for a tool that changes something and needs no input |
| tools.dry_run_now.log | list of object | yes | the operations it would perform, in order: its checks performed, its changes only listed |
| tools.dry_run_now.stopped | string | no | why the tool would stop now; absent when it would run to the end |
| context | object | no | the shape of the context every tool receives, which the entry point resolves (help) |
| answer | object | no | the shape of every answer, whose result is the tool's output (help) |
| releases | list of object | no | where releases live, under ROOT: a release tool's root, or else the root this program was released into (help) |
| releases.path | string | yes | the place, under the release root ROOT |
| releases.holds | string | yes | what it holds |
Give what the list tool gives, with more detail: the shape of each tool's output, of the context every tool receives and of every answer, and where releases live.
capabilities needed: (none)
output
| name | type | required | description |
|---|---|---|---|
| program | string | yes | the program |
| about | string | yes | what it is |
| tools | list of object | yes | every tool: what it does, who may run it, and the shape of a call to it |
| tools.name | string | yes | the tool's name |
| tools.summary | string | yes | what it does |
| tools.group | string | yes | the group it is listed in |
| tools.capabilities_needed | string (fossil-capabilities) | yes | the Fossil capabilities, any one of which lets a user run it; none when anyone may |
| tools.withheld | string | no | why this entry point does not offer it; absent when it does |
| tools.defined_in | string | yes | where it is defined: its source file, from the checkout's root, and the line that declares it |
| tools.input | object | yes | the shape of its input: what a call gives it |
| tools.output | object | no | the shape of its output, an answer's result (help) |
| tools.dry_run_now | object | no | what a dry run of it with no input says now, for a tool that changes something and needs no input |
| tools.dry_run_now.log | list of object | yes | the operations it would perform, in order: its checks performed, its changes only listed |
| tools.dry_run_now.stopped | string | no | why the tool would stop now; absent when it would run to the end |
| context | object | no | the shape of the context every tool receives, which the entry point resolves (help) |
| answer | object | no | the shape of every answer, whose result is the tool's output (help) |
| releases | list of object | no | where releases live, under ROOT: a release tool's root, or else the root this program was released into (help) |
| releases.path | string | yes | the place, under the release root ROOT |
| releases.holds | string | yes | what it holds |
Show the caller, release and export hook, record runs for every clone user named by an administrator, and the daemon's last round. With --login and a clone, include the actor's offer, local care and processes.
capabilities needed: (none)
output
| name | type | required | description |
|---|---|---|---|
| release | string | no | the release this program runs from, with its gate note; absent outside a release |
| context | object | yes | who called and from where, as the entry point resolved it |
| context.entry_point | one of cli, cgi, mcp, git | yes | how the program was entered: cli, cgi or mcp, the entry points to the tools; or git, serving a repository's git export to git clients, neither of which reaches a tool |
| context.preview | boolean | yes | whether this program is the pre-release candidate, run from the release offered as next |
| context.login | string | no | the user acting; absent when none is known |
| context.capabilities | string (fossil-capabilities) | yes | the user's Fossil capabilities; none when no repository says |
| context.repository | string | no | the repository acted on; absent when there is none |
| context.checkout | string | no | the checkout the caller is in; absent outside one |
| context.dir | string | yes | the directory the caller runs in, where relative names start |
| context.root | string | no | the release root this program was released into; absent when it was not |
| context.sources | table of string | yes | where each setting came from |
| context.request | list of string | yes | the names of the request fields the web page read |
| context.environment | list of string | yes | the names, never the values, of the environment variables present but not read |
| context.remote | boolean | no | whether the caller reaches this program from elsewhere: the web page, or MCP over HTTP or a tunnel; a tool that acts on the caller's own files works only where it is not |
| releases | object | no | what the release root serves and offers; absent when this program was not released into one |
| releases.current | string (check-in) | no | the release served, the active release candidate, which ocx2-cgi runs; absent if none |
| releases.previous | string (check-in) | no | the release served before it, which rollback serves again; absent if none |
| releases.next | string (check-in) | no | the release offered as next, the pre-release candidate, which ocx2-cgi-next runs; absent if none |
| releases.changes | string (changes) | no | what the tool changed, from the release it replaced to current, after accept, rollback or follow; else what next changes from current, while another release is offered; absent unless both are named |
| hook | object | no | where the export hook stands; absent when no readable repository is named |
| hook.state | one of installed, other, absent | yes | installed once as Fossil's export; other when an old or repeated hook remains; absent otherwise |
| hook.command | string | no | the installed command, when present |
| hook.others | list of string | yes | the other after-receive programs |
| hook.backoffice | one of queued, nodelay, disabled | yes | when Fossil runs its backoffice |
| hook.chat_user | string | no | the chat user naming timeline events, when configured |
| offer | object | no | the actor's offer: its user, clone server-code and enforced limits; absent on the served repository |
| offer.login | string | yes | the clone user that answers runs on this clone |
| offer.server_code | string | no | this clone's server-code, named by a run's clone field |
| offer.limits | list of string | yes | the limits this actor enforces |
| runs | list of object | no | each readable open run for the clone users the record names; with --login, the actor and its local care |
| runs.run | string | yes | the run, by its hash in full |
| runs.where | object | yes | the thread or ticket it is in, where its reports are written |
| runs.where.kind | string | yes | ticket or forum |
| runs.where.hash | string | yes | the ticket's id, or the hash of the thread's first post, in full |
| runs.objective | string | no | its objective; absent for a run that does not read |
| runs.user | string | no | its process's user; absent for a run that does not read |
| runs.project | string | no | the project of the repository it is in; absent for the served repository |
| runs.started | boolean | yes | whether a started of its login counts |
| runs.in_care | boolean | no | whether this actor has its run in care; absent on the served repository |
| runs.note | string | no | why it waits, or why its actor would refuse it, as its check would decide now; absent when neither |
| runs.release | string (check-in) | no | the release its actor ran it on, $$release$$ in its started; absent before its started |
| runs.current | boolean | no | whether that release is the one served now; a run on another keeps it until it is stopped and sent again |
| runs.hears | list of string | no | for a session, the users whose posts and ticket changes it is given; absent for any other run |
| runs.checkins | list of string | no | for a session, the branches whose check-ins it is given; absent for any other run |
| runs.processes | list of object | no | for setup, the processes now running in its sandbox on this host, read from /proc: each its watcher's descendant, after its parent; none when its actor holds none |
| runs.processes.pid | integer | yes | its number on this host |
| runs.processes.command | list of string | yes | its command line, as /proc/PID/cmdline gives it, each argument apart; empty for one that has ended and is not yet waited for |
| runs.processes.started | string | yes | when it started, from its start after the host's boot in /proc/PID/stat |
| runs.processes.state | string | yes | its state, the letter /proc/PID/stat gives: R running, S sleeping, D waiting on a device, T stopped, Z ended and not yet waited for |
| projects | object | no | in a release root, for setup, the imports running beside the served repository and the last outcome of one the web page started; absent otherwise |
| projects.running | list of object | yes | the imports running now beside the served repository, each the process its directory names, as /proc shows it |
| projects.running.name | string | yes | the new repository's name |
| projects.running.pid | integer | yes | the process importing, by its number on this host |
| projects.running.since | string | yes | when the directory it works in was taken for it, in UTC |
| projects.running.work | string | yes | the directory it works in, beside the served repository |
| projects.left | list of string | yes | the directories beside the served repository of imports whose process ended without releasing them, as when KILL ended it or its host went down, mostly before it logged an outcome: what such an import made outside its directory, its git export and the new repository, placed or not, stays until the next import of its name, which discards it first, as the directory records it, then clears the directory |
| projects.last | object | no | the last outcome in the import log, of an import the web page started; absent before the first, or when its last line does not read as one |
| projects.last.when | string | yes | when it started, in UTC |
| projects.last.repository | string | yes | the served repository, beside which the new one goes |
| projects.last.name | string | yes | the new repository's name |
| projects.last.took_ms | number | yes | how long it took, in milliseconds |
| projects.last.ok | boolean | yes | true when it made the new repository; false when it stopped, leaving nothing |
| projects.last.stopped | string | no | why it stopped; absent when it made the new repository |
| daemon | object | no | the daemon's last round, when this machine keeps its log |
| daemon.when | string | yes | when this round began |
| daemon.clone | string | yes | the clone pulled |
| daemon.completion | integer | yes | the highest receipt after the complete pull |
| daemon.new | integer | yes | how many new messages were read |
| daemon.handed | list of string | yes | the runs handed to watchers |
| daemon.settled | integer | yes | how many runs are settled |
| daemon.passed | list of string | yes | newly read runs passed by this round because their to or clone names another actor, or neither names one |
| daemon.failure | string | no | why this round failed, when it did |
| daemon.listing_failure | string | no | why the optional clone listing could not be shared at start |
Answer with exactly the arguments it was given and who gave them, changing nothing. It shows that every entry point delivers the same input.
capabilities needed: (none)
output
| name | type | required | description |
|---|---|---|---|
| word | string | yes | the word as read |
| option | string | no | the option's value as read; absent when not given |
| flag | boolean | yes | the switch as read |
| entry_point | one of cli, cgi, mcp, git | yes | the entry point it was called from: cli, cgi or mcp |
| login | string | no | the user that called; absent when none is known |
| capabilities | string (fossil-capabilities) | yes | that user's Fossil capabilities |
context
| name | type | required | description |
|---|---|---|---|
| entry_point | one of cli, cgi, mcp, git | yes | how the program was entered: cli, cgi or mcp, the entry points to the tools; or git, serving a repository's git export to git clients, neither of which reaches a tool |
| preview | boolean | yes | whether this program is the pre-release candidate, run from the release offered as next |
| login | string | no | the user acting; absent when none is known |
| capabilities | string (fossil-capabilities) | yes | the user's Fossil capabilities; none when no repository says |
| repository | string | no | the repository acted on; absent when there is none |
| checkout | string | no | the checkout the caller is in; absent outside one |
| dir | string | yes | the directory the caller runs in, where relative names start |
| root | string | no | the release root this program was released into; absent when it was not |
| sources | table of string | yes | where each setting came from |
| request | list of string | yes | the names of the request fields the web page read |
| environment | list of string | yes | the names, never the values, of the environment variables present but not read |
| remote | boolean | no | whether the caller reaches this program from elsewhere: the web page, or MCP over HTTP or a tunnel; a tool that acts on the caller's own files works only where it is not |
answer
| name | type | required | description |
|---|---|---|---|
| ok | boolean | yes | true when the tool did what was asked: ran to its end, or in a dry run said what it would do; false when it stopped |
| tool | string | yes | the tool that answered |
| dry_run | boolean | yes | true when the call only asked what the tool would do, changing nothing |
| log | list of object | yes | the operations the tool performed, in order: in a dry run, its checks performed and its changes only listed; when the tool stopped, the last one is the one that stopped it |
| result | any | no | the tool's output; absent in a dry run, and when the tool stopped |
| stopped | string | no | why the tool stopped, or in a dry run why it would; absent when it ran, or would run, to the end |
| next_step | string | no | when the tool stopped, what to do instead, in one line; absent when it ran to its end, or its reason says |
| took_ms | number | yes | how long the call took, from the program's start to this answer, in milliseconds |
read_clone_users: read clone users from every run, published clones and this host's daemon entries
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
read_run_address: read the local daemon's clone and user for this project; no default when none exists or several match
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| repository | string | yes | the repository holding the run |
| root | string | no | the local daemon's release root; absent on another machine |
read_published_clone: read the recipient's one clone from its public unversioned ocx-clones/LOGIN/SERVER-CODE.json file
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
find_where: find a thread or ticket in the repository by a hash or a prefix of one: a ticket by its id or any of its changes, or a thread by any of its posts
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| repository | string | yes | the repository |
| given | string | yes | the thread or ticket as given: a ticket's id, a ticket change's or a forum post's hash, or a prefix of one |
find_post: find the post replied to by its hash or a prefix of it, read from its artifact, and the thread it is in
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| given | string | yes | the post as given |
find_run: find a run in the repository by its hash or a prefix of it: the post or ticket change that holds it, the user its to asks to act, and the clone it names
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| repository | string | yes | the repository |
| given | string | yes | the run as given: its hash, or a prefix of it |
| upto | integer | no | the last completed pull; absent on the served repository |
read_completion: read the daemon's last completed pull of this clone, refusing a clone never pulled whole
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| repository | string | yes | the clone |
| root | string | yes | the release root |
read_hook: read Fossil's export hook, other after-receive programs, backoffice settings and the timeline chat user
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| repository | string | yes | the repository |
read_server_code: read the repository's server-code, which a run names in its clone for OCX on this repository alone to act on (docs/protocol-v2-draft.md, section 2.4)
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| repository | string | yes | the repository |
read_runs: read runs from the record for every clone user an administrator named, or the actor with its local care and processes
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| repository | string | yes | the repository or clone |
| root | string | no | the release root, when known |
| processes | boolean | yes | whether local processes are read too |
| ended | boolean | yes | whether ended runs are read too |
read_projects: read the imports running beside the served repository, each the process its directory names, as /proc shows it, the directories of those whose process ended without releasing them, and the last outcome in the import log
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| served | string | yes | the served repository |
| root | string | yes | the release root, whose care directory holds the import log |
read_offer: read the actor's offer: its user, clone server-code and enforced limits
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| repository | string | yes | the acting clone |
| login | string | yes | the clone user signed in to the server |
read_releases: read which release the root serves and offers
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| root | string | yes | the release root |
check_committed: check that a Fossil checkout has every change committed, and name the release after its check-in
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| checkout | string | yes | the checkout |
read_targets: read which programs a checkout's shard.yml builds from tools/
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| checkout | string | yes | the checkout |
find_offered: find the release the staged area offers as next, unless it is already served
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| root | string | yes | the release root |
check_first_release: check that the root serves no release yet: the pre-release candidate accepts only an actor's first release, trusted on first use
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| root | string | yes | the release root |
check_staged_release: check that the staged release is whole: every file its inventory lists is there and matches, and nothing else is
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| root | string | yes | the release root |
| name | string | yes | the release checked |
find_previous: find the release the root served before the current one
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| root | string | yes | the release root |
fetch_pattern: fetch a pattern: a wiki page of the served repository, its newest version that a user holding admin or setup sent, read there, or in a clone just pulled, by the server's order and its receipt tool's word; or the text at an http or https URL; whose first fenced JSON block holds the fields a run starts from
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| url | string | yes | the pattern: a wiki page of the served repository by its name, or an http or https URL, read without signing in |
| repository | string | yes | the served repository, whose own wiki pages are read in it; or a clone, just pulled, whose pages are read there |
| server | string | no | for a clone, the server it syncs with, by its URL: its pages are its, and its receipt tool, asked unsigned, says who sent each version and in what order; absent on the served repository |
check_import: check the owner-written builders.json, the run's pattern, address and sender, its first counted reports, every shared file and inventory, and that its staged name is free
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| root | string | yes | the release root |
| run | string | yes | the stage run's full hash |
| program | string | yes | the program a release of which it is |
read_served_release: read current and previous and their inventories; optionally read one listed file, base64
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| root | string | yes | the release root |
| release | string | no | the release to read a file from |
| file | string | no | the listed file to read |
read_follow_release: sign in with the daemon's credentials for this server and read its current release
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| root | string | yes | the client's release root |
| server | string | yes | the served repository's URL |
fetch_follow_release: check every SHA-256, fetching listed files absent from the client's release
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| root | string | yes | the client's release root |
| name | string | yes | the release to fetch |
decide_run: decide the manual run on this acting clone, reading its server's receipts and local care
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| repository | string | yes | the clone |
| run | string | yes | the run's full hash |
| root | string | yes | the release root |
| completion | integer | yes | the last completed pull |
find_terminal: find the socket of the terminal a run's process is on, in this host's care directory, by the run's hash or a prefix of it
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| directory | string | yes | the care directory |
| given | string | yes | the run as given: its hash, or a prefix of it |
read_asked: read every post and ticket change the ocx-message tag was ever put on, whatever its value and whether or not it was cancelled since, its message saying what it is, in the server's order, each with the user the server received it from
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| repository | string | yes | the repository |
describe_references: describe each link a person is shown, where each question and run is and what a question replies to or refers to: its kind, title, sender, time and excerpt, each hash in it shown by its artifact's title, or cut, only as far as the caller may read it, by one query for the links and one for the hashes their excerpts hold; and each link in full, from the server's public URL
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| repository | string | yes | the repository |
| readable | list of string | yes | the kinds of what a link names that the caller may read |
| server | string | no | the server whose links are given in full, by its URL, any user or password left out: a clone's remote; absent on the served repository, whose public URL is read |
title_notes: show each hash the notes of decisions and runs hold by its artifact's title, or cut, as a reference's excerpt shows one, only as far as the caller may read it, by one query for them all
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| repository | string | yes | the repository |
| readable | list of string | yes | the kinds of what a hash names that the caller may read |
resolve_references: resolve each reference given to the one artifact, ticket, tech-note or wiki page it names where the caller is, in its clone or on the served repository, by one query: a hash, a prefix, an id, or a link of the server, whole or from its root; each written as a link from the repository's root, a file's lines on its artifact's page, with its title
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| given | list of string | yes | the references, as given |
| server | string | no | the server whose links are taken, by its URL, any user or password left out: the clone's remote; absent on the served repository, whose public URL is read |
read_card: read a card definition and its selected columns from the named repositories
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| project | string | yes | the project defining the card |
| name | string | yes | the card name |
| repositories | list of string | yes | the repositories to read |
| viewer | string | yes | the viewer login |
| now | string | yes | the clock for time spans |
ask_receipt_service: ask the receipt service what it received each artifact from, and what one user may do there
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| artifacts | integer | yes | how many artifacts are asked of |
| user | string | no | the user asked of; absent when none is |
read_receipts: read which user the served repository received each artifact from, that user's capabilities there, and the receipt's number and the artifact's row number
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| repository | string | yes | the repository |
| artifacts | list of string | yes | the artifacts, by their hashes in full |
read_capabilities: read the capabilities a user holds on the served repository, as Fossil grants them, inherited ones included
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| repository | string | yes | the repository |
| user | string | yes | the user |
read_wiki_moderation: read whether the served repository holds each wiki edit for a moderator unless its user holds ModWiki (l), as its moderation setup sets it, which no clone holds
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| repository | string | yes | the repository |
read_ticket_moderation: read whether the served repository holds each ticket change made in its ticket pages for a moderator unless its user holds ModTkt (q), as its moderation setup sets it, which no clone holds
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| repository | string | yes | the repository |
read_remote: read the server a clone syncs with, by its URL, as Fossil's remote names it
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| checkout | string | yes | the clone's checkout |
ask_server_receipts: ask the server's own receipt tool, unsigned, as anyone may: what it received each artifact from, and what one user may do there
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| server | string | yes | the server, by its URL, any user or password left out |
| artifacts | integer | yes | how many artifacts are asked of |
| user | string | no | the user asked of; absent when none is |
find_checkin: find the check-in by its hash, a prefix of it or a name, and the user who checked it in
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| given | string | yes | the check-in as given |
check_not_author: check that the verdict comes from someone other than the check-in's author
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| author | string | yes | the check-in's author |
| login | string | yes | the user giving the verdict |
read_verdict: read the verdict back as the served repository holds it: there, from its tags; from a clone, by a second push that must send nothing
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| checkin | string | yes | the check-in |
| checkout | string | no | the clone's checkout it was made in; absent when it was made on the served repository |
read_unaudited: read the check-ins that change files, and every verdict's tag change with who sent it, by the served repository's receipts; keep the check-ins no verdict that counts has judged, in the order it received them
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| repository | string | yes | the repository |
| branch | string | no | the branch read; every branch when absent |
ask_server_unaudited: ask the server's own unaudited tool, unsigned, as anyone may, which counts verdicts by its own receipts
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| server | string | yes | the server, by its URL, any user or password left out |
| branch | string | no | the branch asked of; every branch when absent |
read_approval: read what the served repository keeps for a login an admin approved: its code's key and its password; none unless the user is there still holding that password, so a user made again by hand is not taken for it
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| login | string | yes | the login |
collect_password: ask the server's collect for the login's password, giving its code; none while no admin has approved the login
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| server | string | yes | the server |
| login | string | yes | the login asked for |
sign_in: sign in to the server as the login its file of passwords names, through Fossil's login page, and check that the server has that user, holding neither admin nor setup (docs/protocol-v2-fossil.md, section 5)
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| server | string | yes | the server's URL |
| credentials | string | yes | the actor's file of passwords, by its path; never what it holds |
find_export: find the repository's git export where its last-git-export-repo setting says, and read where it stands, as fossil git status says, with OCX's last run of it
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| repository | string | yes | the repository |
check_project: check the daemon's care directory, when the daemon is on this machine, the new repository's name, that nothing of that name is served or exported yet, and where the upstream is
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| name | string | yes | the new repository's name |
| upstream | string | no | the upstream: a git repository's URL, or its directory here |
| served | string | yes | the served repository, beside which the new one goes |
| mirrors | string | no | the directory of git exports that the new one's export goes in; absent for the one that holds the served repository's export |
| daemon_root | string | no | the ocx2 daemon's release root, when the daemon is on this machine; absent when its actor joins from another |
read_served_setup: read what the new repository takes from the served one: this release's hook, if it is installed there, and its public URL
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| served | string | yes | the served repository |
| name | string | yes | the new repository's name |
read_save_state: read the checkout's changes, the branch it is on, the tests its project names, and which passed with the checkout as it is now
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
read_bundle: read the agent's bundle: each check-in it holds, the branch it is on and its comment, importing nothing
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| file | string | yes | the bundle, as written to a file in a scratch directory |
pull_and_export: pull the server into the clone, and bundle every check-in after the one the agent has
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| have | string | yes | the check-in the agent has |
| file | string | yes | the bundle's file |
confirm_landed: find each pushed check-in by its hash in full, and ask the server's receipt tool who it received each from
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| pushed | list of string | yes | the check-ins pushed, as the bundle lists them |
bundle_branch: bundle every check-in on the working branch, whole, base64
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| branch | string | yes | the working branch |
read_context: read the run the checkout's workspace is named for, the branch the checkout is on, its changed and new files, and the tests its project names
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
find_text: search the checkout's text files under a path for each line holding a text, exactly
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| text | string | yes | the text |
| under | string | yes | the path searched under |
read_lines: read lines of a file in the checkout, exactly as they are
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| path | string | yes | the file, by its path from the checkout's root |
| from | integer | yes | the first line read |
read_whole: read a file of the checkout whole, or find it absent
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| path | string | yes | the file, by its path from the checkout's root |
read_wiki_page: read the newest version of a wiki page in the clone
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| name | string | yes | the page's name |
list_unversioned: list the clone's unversioned files: each name, the hash of its content and its size
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
read_unversioned: read an unversioned file's content from the clone, base64
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| name | string | yes | the file's name |
ask_server_capabilities: ask the server's receipt tool what the clone's user may do there, since Fossil passes over unversioned files a user may not write and says nothing
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| user | string | yes | the user |
read_own_capabilities: read the capability letters a user of the served repository holds of its own, not those Fossil's own users lend it
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| user | string | yes | the user |
read_thread: read every post of the thread, or every change to the ticket that adds text, in the order the repository received them
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| record | string | yes | the thread, by its first post, or the ticket, by its id |
| repository | string | yes | the repository read |
read_conversation: read the name a person gave the thread, the raw tag console-name on its first post, as it is now
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | false: a check reads what the run needs, in a dry run too |
| root | string | yes | the thread, by its first post |
| repository | string | yes | the repository read |
start_project: take the directory the import works in, as take_work does, for the import it starts there, detached, as the hook starts a watcher: this release's program, given that directory, which holds what it imports, its output in the care directory, so the web page answers at once; the import writes its outcome in the import log, beside the hook's, which status shows with the imports running
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| work | string | yes | the directory the import works in |
| repository | string | yes | the new repository, which must not be there yet |
| program | string | yes | the program started: this release's, the current one or, from the preview, the one offered as next |
take_work: take the directory the import works in, beside the served repository, for this process, which it names there: refused while another import's process named there runs; made anew by an exclusive create where an import that ended left it, but kept as it was left where it records what that one made outside it, for discard_left; taken already when the web page started this process to import (start_import), which then releases it once its outcome is logged
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| work | string | yes | the directory the import works in |
| repository | string | yes | the new repository, which must not be there yet |
discard_left: discard what an import of this name that ended unasked, as KILL ends one, made outside the directory it worked in, as that directory records it: its git export, and the new repository, out of its login group first; then clear the rest it left there, but the process named; refused, saying why, where that repository cannot leave its group, and where the repository or export is there, unrecorded
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| work | string | yes | the directory the import works in, as the import that ended left it |
| discarded | list of string | yes | what that import made outside it, as the directory records it: its git export, the new repository, or both |
run_gate: run a checkout's own checks (crystal run ci.cr), writing what they print to its log as it comes, and answer the gate's note
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| checkout | string | yes | the checkout |
| log | string | yes | where what the gate prints is written as it runs, so a long gate can be followed |
run_build: build a checkout's programs (shards build)
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| checkout | string | yes | the checkout |
copy_release: copy a checkout's built programs into a release in the staged area, with the gate's note, where the source is, and its inventory
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| checkout | string | yes | the checkout, whose bin/ holds the programs |
| release | string | yes | the release's directory: the staged area's, named for the check-in |
| programs | list of string | yes | the programs copied |
smoke_release: run a release's program with no arguments and an empty environment, and require it to print its usage
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| release | string | yes | the release's directory |
| program | string | yes | the program run |
offer_release: point the staged area's next at a release, the pre-release candidate, which ocx2-cgi-next runs
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| staged | string | yes | the staged area |
| name | string | yes | the release offered |
take_release: copy a staged release into the root, checking every file against its inventory
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| root | string | yes | the release root |
| name | string | yes | the release taken |
serve_release: point the root's current at an accepted release, which ocx2-cgi then runs, and previous at the release it replaces
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| root | string | yes | the release root |
| name | string | yes | the release served |
| replaces | string | no | the release served before, which becomes previous; absent for a first release, trusted on first use |
roll_back: serve the previous release again, which ocx2-cgi then runs, keeping the release it replaces as previous
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| root | string | yes | the release root |
| name | string | yes | the release served again |
| replaces | string | no | the release served before, which becomes previous; absent if none |
start_ticket: start a ticket, Open, on the served repository as the caller, and name it and its first change
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| title | string | yes | the ticket's title |
| user | string | yes | the caller, whose ticket it is |
append_to_ticket: append to the ticket's comment as the caller, in the caller's clone and pushed, or on the served repository as the viewer, and name the new change
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| ticket | string | yes | the ticket's id |
| user | string | yes | the caller, whose change it is |
| checkout | string | no | the clone's checkout it is made in; absent when it is made on the served repository |
write_thread: write the run as the first post of a new thread, as the caller on the served repository
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| title | string | yes | the thread's title |
| user | string | yes | the caller, whose post it is |
write_reply: write a reply to the post, in its thread, as the caller on the served repository
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| thread | string | yes | the thread, by its first post |
| to | string | yes | the post replied to |
| user | string | yes | the caller, whose post it is |
copy_import: copy the three counted files into staged/NAME, check the inventory and smoke the program with no arguments
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| root | string | yes | the release root |
| name | string | yes | the check-in's first twelve hex digits |
| program | string | yes | the program smoked |
remove_release_files: remove this run's program, release.txt and gate.txt unversioned files from the served repository
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| run | string | yes | the stage run's full hash |
| program | string | no | the program whose files they are |
take_follow_release: put the checked release into the client's root as accept does
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| root | string | yes | the client's release root |
| name | string | yes | the release taken |
hand_run: hand the manual run to this release's watcher with its clone and explicit server credentials
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| repository | string | yes | the clone |
| root | string | yes | the release root |
| run | string | yes | the run's full hash |
write_stop: write the stop where the run is, as the caller on the served repository: a reply to the run's post in its thread, or a change to its ticket
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| run | string | yes | the run's post or ticket change |
| kind | string | yes | forum or ticket |
| record | string | yes | the run's thread, by its first post, or its ticket |
| user | string | yes | the caller, whose stop it is |
join_terminal: join your terminal to the terminal of a run's process until you press Ctrl-]: you see what it shows and type into it, and it goes on when you leave
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| socket | string | yes | the terminal's socket |
put_post: put the reply into the caller's clone as Fossil's forum artifact, index it there, and push it, so the served repository takes it as a post by the user that pushed it
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| thread | string | yes | the thread |
| to | string | yes | the post replied to |
| user | string | yes | the caller, whose post it is |
| checkout | string | yes | the clone's checkout it is put in |
tag_checkin: tag the check-in audited with the verdict and the note, as the caller, in the caller's clone and pushed, or on the served repository as the viewer
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| checkin | string | yes | the check-in |
| value | string | yes | the tag's value: the verdict, a colon, the note, and what it was judged against |
| login | string | yes | the caller, whose verdict it is |
| checkout | string | no | the clone's checkout it is made in; absent when it is made on the served repository |
set_secret: set the secret on the served repository, a setting of its own that Fossil never syncs or clones, its value shown nowhere
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| name | string | yes | the secret's name |
approve_login: make the login asked for, or set the one approve made before, holding exactly the capabilities asked, with a random password the served repository keeps with the code's key, apart from its secrets, for the asker to collect, never shown; the same password when approved again for the same code; for another code, a new one, and the earlier holder's stops working
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| login | string | yes | the login |
| capabilities | string (fossil-capabilities) | yes | the capabilities it holds |
| there | boolean | yes | whether the user was there already |
make_run_user: make a user for the run's process on the served repository, holding only what a run's user needs, its random password kept for the run's clone user to collect and never shown
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| user | string | yes | the user made |
| login | string | yes | the clone user approved to collect its password |
| capabilities | string | yes | its capabilities |
| by | string | yes | who made it, as its contact information says |
approve_run_user: approve a kept run user's password for the run's clone user to collect, setting a new random password only when asked
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| user | string | yes | the run's user |
| login | string | yes | the clone user approved to collect |
| reset | boolean | no | whether a new random password was explicitly requested |
make_code: make the code the login is approved by, and keep it with the login and the capabilities asked in the file of passwords, readable by its owner alone
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| login | string | yes | the login asked for |
| capabilities | string (fossil-capabilities) | yes | the capabilities asked for |
| credentials | string | yes | the file of passwords |
keep_password: keep the login's password in the file of passwords in place of the code, readable by its owner alone
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| credentials | string | yes | the file of passwords |
clone_server: make the acting clone of the server, signed in as the clone's user
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| repository | string | yes | the clone |
| user | string | yes | the clone's user |
prepare_clone: name the actor's default user and keep the clone's default remote as the named remote used for complete pulls, verdicts and shares
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| repository | string | yes | the acting clone |
| user | string | yes | the clone's user |
watch_run: watch the run under its lock, deciding again and posting reports through Fossil's pages
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| repository | string | yes | the clone |
| root | string | yes | the release root |
| run | string | yes | the run's full hash |
| by_hand | boolean | yes | whether a person starts this manual run |
delete_hooks: delete Fossil's export command and any old ocx2-hook command, leaving other hooks
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| repository | string | yes | the repository |
add_hook: add the hook to the repository's hooks, for Fossil's backoffice to run after each receipt
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| repository | string | yes | the repository |
| command | string | yes | the command Fossil runs, the repository in place of %R |
export_to_git: export the check-ins waiting, with fossil git export, one run at a time: while another run holds the export, ask it to export again instead; it exports until no run asks
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| mirror | string | yes | the export's directory |
| awaiting | integer | no | how many check-ins wait to be exported; absent when Fossil cannot say, and the export mends that |
| autopush | string | no | where Fossil pushes after each export, or off |
| failed | string | no | why Fossil cannot say where the export stands, else why the last run failed; absent when neither |
clone_project_upstream: clone the upstream bare, in a sandbox, since an upstream may be anyone's
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| upstream | string | yes | the upstream |
| work | string | yes | the directory the import works in, taken for it |
new_project: make an empty Fossil repository with the project's name and the caller as admin
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
empty_project_export: reserve the empty project's git export and record it for cleanup
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
set_project_tickets: give the new repository's tickets milestone and due fields
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
ready_project: file clone and process passwords privately, making their users and letting the daemon find the project by its password file
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
project_branches: write the upstream's branches as a git fast-export stream with its marks, naming its own branch trunk as Fossil does, straight into Fossil's import, which makes a new repository with Fossil's marks, through a pipe, never a file; git and fossil each in a sandbox of its own; the tags stay git's
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| work | string | yes | the directory the import works in |
| admin | string | yes | the new repository's admin, the caller |
seed_project_export: make the new repository's git export from the upstream's clone, its state seeded with each check-in and the upstream commit it is, so the upstream's commits keep their ids and what Fossil adds exports on top of them; its directory made by an exclusive create, and recorded in the directory the import works in once made
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| work | string | yes | the directory the import works in |
| mirror | string | yes | the git export made |
| main_branch | string | yes | the git branch Fossil's trunk exports as: the upstream's own |
export_project: export the new repository once, in the directory the import works in, which records its export and adds nothing; the export's git configuration keeps the upstream's URL
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| repository | string | yes | the new repository, in the directory the import works in |
| mirror | string | yes | its git export |
set_public_url: set the new repository's public URL, its email-url, for its administrator, the caller: the served one's with its own name, so it is ready to use and a run's clone can be made from it with no step by hand
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| repository | string | yes | the new repository, in the directory the import works in |
| url | string | yes | its public URL |
copy_patterns: copy the served repository's patterns, its wiki pages run/NAME, into the new one, so runs are written there as on the served one
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| served | string | yes | the served repository |
| repository | string | yes | the new repository, in the directory the import works in |
| pages | list of string | yes | the pages copied: the patterns that a user holding admin or setup wrote |
| admin | string | yes | who writes them: the new repository's admin, the caller |
hook_project: install the hook on the new repository as this release's is installed on the served one, so its export is kept current
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| repository | string | yes | the new repository, in the directory the import works in |
| hook | string | yes | the hook's command, as this release installs it on the served repository |
place_project: place the new repository beside the served one, made in the directory the import works in with all but its login group, by one rename, recorded in that directory first, so it is never placed unrecorded: should the import end unasked before it is in the group, as KILL ends one, the next import of its name discards it
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| work | string | yes | the directory the import works in |
| repository | string | yes | the new repository's place, beside the served one |
join_login_group: join the new repository to the served one's login group, made of the two and named for the served one when it is in none, so signing in to the served repository signs the caller in to the new one, where the caller is admin
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| repository | string | yes | the new repository |
| served | string | yes | the served repository |
commit_work: track the checkout's new files and commit every change on the working branch, starting it if the checkout is on another, without syncing
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| branch | string | yes | the working branch |
| message | string | yes | the check-in's comment |
import_and_push: import the agent's bundle into the clone, its check-ins public, and push them to the server as the clone's user
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| file | string | yes | the bundle's file |
| checkins | list of string | yes | the check-ins it holds, by their hashes as the bundle gives them |
write_file: write a file of the checkout whole, making its directory if it has none
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| path | string | yes | the file, by its path from the checkout's root |
| bytes | integer | yes | how many bytes it holds |
run_test: run a test the project names, in the checkout, within its wall clock, and record whether it passed with the checkout as it is
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| name | string | yes | the test's name |
| command | list of string | yes | its command |
push_work: push the clone's check-ins to the server as its user
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
pull_clone: pull the server into the clone, so what is read is the server's newest; refused when the pull does not reach it
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
write_wiki_page: write a new version of a wiki page in the clone, or the page itself when it is new, and push it as the clone's user
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| name | string | yes | the page's name |
| new | boolean | yes | whether the page is new |
sync_unversioned: sync the clone's unversioned files with the server's, as the clone's user: send what the server lacks, take what it has newer
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
put_unversioned: keep content as an unversioned file of the clone
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| name | string | yes | the file's name |
| size | integer | yes | its size in bytes |
keep_connector_key: keep the SHA-256 of the connector's new key for the login it acts as, not yet approved, replacing any kept for it, in a config row, and its issuer's metadata as an unversioned file, where a client looks for it; or remove both, so no key acts as that login; the key itself is kept nowhere
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| login | string | yes | the login the key acts as |
| revoked | boolean | yes | whether the key is removed |
add_own_capability: add a capability letter to those a user of the served repository holds of its own, unless they hold it, in one statement, leaving every other letter as it is then, so one another writer gave the user since they were read stays
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| user | string | yes | the user |
| capability | string (fossil-capabilities) | yes | the letter added |
remove_own_capability: take a capability letter out of those a user of the served repository holds of its own, in one statement, leaving every other letter as it is then, so one another writer gave the user since they were read stays
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| user | string | yes | the user |
| capability | string (fossil-capabilities) | yes | the letter taken out, every one of it |
keep_app_builders: keep, in a config row of the served repository, the stage pattern and the builder whose runs import may take as releases of the app, replacing any kept before
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| app | string | yes | the app |
tag_untagged: read every post and ticket change holding an OCX message, as the actor's check reads them, and tag each that lacks the ocx-message tag, or carries another value, in one control artifact, as the caller: on the served repository, or in the caller's clone and pushed
| name | type | required | description |
|---|---|---|---|
| op | string | no | the operation |
| changes | boolean | no | true: a change is performed only for real; a dry run lists it |
| user | string | yes | the caller, whose tags they are |
| checkout | string | no | the clone's checkout it is made in; absent when it is made on the served repository |
releases
ROOT/staged/NAME/
- holds: a release stage built; NAME is the first twelve hex digits of its Fossil check-in
ROOT/staged/next
- holds: the release offered: the pre-release candidate, which Fossil's page ocx2-cgi-next runs
ROOT/NAME/
- holds: a release accepted: a copy, checked file by file
ROOT/current
- holds: the active release candidate, which ocx2-cgi runs
ROOT/previous
- holds: the release served before it, which rollback serves again