A GitHub project (Projects v2: github.com/users/<login>/projects/<n>, or orgs/<login>/...) seen as the data of a kanban board (mmo.client's <mmo-kanban>), and the changes made on the board written back to the project.
class MMO\git\helpers\ProjectBoard extends MMO\git\classes\aBoard
Through the GraphQL API: it needs a token that can read projects, and write them to save (README.md says which).
### What an item becomes
| ticket | project item |
|---------------|-------------------------------------------------------------------------------------------|
| statuses | the options of the `Status` field, in the project's order |
| `id` | the issue's or pull request's number; `d<n>` for a draft |
| `title`, `description`, `assignee`, `labels` | the issue's, pull request's or draft's (a draft has no label) |
| `status` | its `Status`; an item without one has the first |
| `category` | its value of [`$categoryField`](https://mmoframework.fr/documentation/mmo.git/php/helpers/ProjectBoard.md#projectboard-categoryfield): the project's first iteration field unless told |
| `start`, `end`| its values of the date fields [`$startField`](https://mmoframework.fr/documentation/mmo.git/php/helpers/ProjectBoard.md#projectboard-startfield) and [`$endField`](https://mmoframework.fr/documentation/mmo.git/php/helpers/ProjectBoard.md#projectboard-endfield) |
| `parent`, `constraint`, `startedAt` | a text field of the project, [`$metaField`](https://mmoframework.fr/documentation/mmo.git/php/helpers/ProjectBoard.md#projectboard-metafield), made the first time it is needed |
A status is "done" when its name says so ([`$done`](https://mmoframework.fr/documentation/mmo.git/php/helpers/ProjectBoard.md#projectboard-done)), "not started" when it says that ([`$backlog`](https://mmoframework.fr/documentation/mmo.git/php/helpers/ProjectBoard.md#projectboard-backlog)), started
otherwise. A new ticket is a draft issue of the project. A ticket removed from the board leaves the project: its
issue, if it has one, stays as it is. The issues' state is not changed: the project's own workflows close an issue
whose item is done, when they are set up to. A draft becomes an issue when asked ([`toIssue`](https://mmoframework.fr/documentation/mmo.git/php/helpers/ProjectBoard.md#projectboard-toissue)), to be commented on.
Ask GitHub for the ticket's item by its node id, rather than trust the listing of the project's items: GitHub lists a draft just made minutes later (345 s, seen on 19/10/2026).
Ask GitHub for the ticket's item by its node id, rather than trust the listing of the project's items: GitHub lists a draft just made minutes later (345 s, seen on 19/10/2026).
function isGone(string $ticketId, ?string $locator): ?bool
true when GitHub has no such item, or has it archived, or in another project (what load leaves out); false when the project has it; null without a locator, or when GitHub answers something else
array<string, string>, saved: array} the id each new ticket got (d<n>), by the id the board gave it; and the board as the project has it now (load's shape: its tickets with their new ids, their item and content) -- what the next save compares with: GitHub lists a draft just made some time after, so reading the project again at once could miss it, and the next save would make it twice, then remove one
lève
when GitHub refuses a change: the ones made before it are made
Make an issue of a draft, in its place in the project: an issue has a discussion, a draft has none. Its title, text and assignees go with it, its fields stay the item's.
function toIssue(string $ticketId, string $repository): string
the ticket. Beyond the board's fields, it carries what saving needs: item (the item's node id), content (the draft's node id, or the issue's {repository, number}) and url