Skip to content

neo ticket

Manage team tickets.

A ticket is team-scoped planning work, addressed KEY-N, and a team’s board is its tickets. The repo-scoped twin is neo issue, which works a repository’s intake (owner/repo#N); see neo docs tickets-and-issues.

neo ticket [OPTIONS] <COMMAND>

Create a ticket on a team’s board.

Fields come from flags, an issue document (--edit, --from-file), or both — flags win.

neo ticket create [OPTIONS] --team <TEAM>
Option Value Required Default Env Values Description
--team <TEAM> yes Team key (ENG or <workspace>/ENG) whose board the ticket lands on. A ticket has no repo, so this is its only scope
--title <TITLE> no Title, required unless --edit or --from-file supplies it. It is the whole of what a list, a search result or a link preview shows; the detail belongs in --body
--body <BODY> no Markdown description. Mutually exclusive with --body-file
--body-file <PATH> no Read the markdown description from a file instead of a shell argument — - reads stdin. Avoids shell-quoting long bodies. Mutually exclusive with --body
--priority <PRIORITY> no none, urgent, high, medium, low Priority to file it at. Left to the server’s default when omitted
--status <STATUS> no backlog, todo, in_progress Initial status. Omitted: backlog for a ticket (the board’s intake column), todo for a repo issue
--label <NAME> no Label to attach, by name; repeatable. Resolved against the repo’s or team’s labels (labels lists them) before anything is created, so a typo files nothing. Replaces the document’s labels when given
--assignee <HANDLE> no Handle to assign (alice or @alice; @me is you); repeatable. Replaces the document’s assignees when given
--edit, -e no Write it in $VISUAL / $EDITOR (else vi): opens an issue document — a template on create, the current values on edit — and applies what you save. Saving an empty title on create aborts with nothing sent; edit sends only what changed. Flags given beside it win over what you save
--from-file <PATH> no Read an issue document (frontmatter, then the markdown body) from PATH; - reads stdin. The non-interactive twin of --edit, for an editor plugin piping a buffer in. Keys the document leaves out keep their current value on edit; flags given beside it win
--tracks <OWNER/REPO#N> no Repo-bound issue this ticket tracks, as acme/api#1526 or api#1526 (owner defaults to your handle) — accepting a triage item. The ticket and the tracks link are written in one transaction; the issue stays open
--json no Print the created ticket as JSON

List a team’s triage: open repo issues no ticket tracks yet.

Covers the repositories the team holds a grant on, filtered to the ones you can read. Accept an item with neo ticket create --team KEY --tracks owner/repo#N, link it to an existing ticket with neo ticket track, or close it with neo issue close.

neo ticket triage [OPTIONS] --team <TEAM>
Option Value Required Default Env Values Description
--team <TEAM> yes Team key (ENG or <workspace>/ENG) whose triage to list
--json no Print every page, merged, as one JSON response

List a team’s board.

A board holds the team’s tickets and nothing else, so every row renders KEY-N. A repo-bound issue lives on its repo’s issue list (neo issue list <owner>/<repo>) even when it carries the same team. Every filter is applied by the server, and every page is followed.

neo ticket list [OPTIONS] --team <TEAM>
Option Value Required Default Env Values Description
--team <TEAM> yes Team key (ENG or <workspace>/ENG) whose board to list
--state <STATE> no open open, closed, all, backlog, todo, in_progress, in_review, done, cancelled, duplicate open (non-terminal), closed (done/cancelled/duplicate), all, or one exact status
--search <TEXT> no Only issues whose title, description or number contain TEXT (case-insensitive, matched by the server)
--label <NAME> no Only issues carrying this label, by name
--assignee <HANDLE> no Only issues assigned to HANDLE; @me is you
--priority <PRIORITY> no none, urgent, high, medium, low Only issues at this priority
--limit <N> no Stop after N issues. Omitted: every page
--json no Print {issues} as JSON, every fetched page merged

List the tickets and issues assigned to you, across every team and repo.

--created lists the ones you filed instead. Same list as neo issue mine: both kinds, each under its own reference.

neo ticket mine [OPTIONS]
Option Value Required Default Env Values Description
--created no The ones you filed, instead of the ones assigned to you
--state <STATE> no open open, closed, all open (non-terminal), closed (done/cancelled/duplicate) or all
--limit <N> no Stop after N. Omitted: every page
--json no Print every page, merged, as one JSON response

List the labels a team offers.

The names --label, --add-label and an issue document’s labels resolve against.

neo ticket labels [OPTIONS] --team <TEAM>
Option Value Required Default Env Values Description
--team <TEAM> yes Team key (ENG or <workspace>/ENG) whose labels to list
--json no Print {labels} as JSON

Show one ticket with its comments

neo ticket view [OPTIONS] <TICKET>
Option Value Required Default Env Values Description
<TICKET> yes Ticket to act on, as ENG-7 or <workspace>/ENG-7
--json no Print {issue, comments} as JSON
--document no Print it as an issue document (frontmatter with its labels and assignees, then the body) — the format edit --from-file reads back, for an editor plugin’s buffer

Agent context pack for a ticket (always JSON).

The ticket plus its labels, links, comments, and every linked PR (open AND closed) with a checks summary and review comments/threads. --attachments <DIR> also downloads the images it references.

neo ticket context [OPTIONS] <TICKET>
Option Value Required Default Env Values Description
<TICKET> yes Ticket to act on, as ENG-7 or <workspace>/ENG-7
--attachments <DIR> no Also download every attachment the pack references into DIR (created if missing), as <id>.<ext>. stdout is still exactly the JSON pack; each attachment gets one line on stderr, /a/<id> -> <path>, or a skip line for one you cannot read, which is not an error
--json no Accepted so every verb takes --json; the pack is always JSON

Close a ticket with a terminal status

neo ticket close [OPTIONS] <TICKET>
Option Value Required Default Env Values Description
<TICKET> yes Ticket to act on, as ENG-7 or <workspace>/ENG-7
--reason <REASON> no done done, cancelled, duplicate Terminal status to close it with
--comment <BODY> no Markdown comment to post before closing
--json no Print the updated ticket as JSON

Edit a ticket’s fields, labels and assignees.

Only what differs from the ticket’s current state is sent; anything omitted keeps its current value. At least one of --title, --body, --body-file, --priority, --status, a label or assignee flag, --edit or --from-file is required. A failure partway through reports which writes landed and which were never attempted.

neo ticket edit [OPTIONS] <TICKET>
Option Value Required Default Env Values Description
<TICKET> yes Ticket to act on, as ENG-7 or <workspace>/ENG-7
--title <TITLE> no Replace the title
--body <BODY> no Markdown description. Mutually exclusive with --body-file
--body-file <PATH> no Read the markdown description from a file instead of a shell argument — - reads stdin. Avoids shell-quoting long bodies. Mutually exclusive with --body
--priority <PRIORITY> no none, urgent, high, medium, low Replace the priority
--status <STATUS> no backlog, todo, in_progress, in_review, done, cancelled, duplicate Move it to this status. Sent by transition, as the web UI does: to a terminal status (done/cancelled/duplicate) it is a close with that reason; from a terminal status to an open one it is a reopen, then the status; between open statuses it is the plain field write. A document’s status: is sent the same way
--add-label <NAME> no Attach a label, by name; repeatable. Resolved against the repo’s or team’s labels (labels lists them)
--remove-label <NAME> no Detach a label, by name; repeatable. One that is not attached is left alone
--add-assignee <HANDLE> no Assign someone (alice or @alice; @me is you); repeatable
--remove-assignee <HANDLE> no Unassign someone; repeatable. One who is not assigned is left alone
--edit, -e no Write it in $VISUAL / $EDITOR (else vi): opens an issue document — a template on create, the current values on edit — and applies what you save. Saving an empty title on create aborts with nothing sent; edit sends only what changed. Flags given beside it win over what you save
--from-file <PATH> no Read an issue document (frontmatter, then the markdown body) from PATH; - reads stdin. The non-interactive twin of --edit, for an editor plugin piping a buffer in. Keys the document leaves out keep their current value on edit; flags given beside it win
--json no Print the updated ticket as JSON

Re-open a closed ticket

neo ticket reopen [OPTIONS] <TICKET>
Option Value Required Default Env Values Description
<TICKET> yes Ticket to act on, as ENG-7 or <workspace>/ENG-7
--json no Print the updated ticket as JSON

Comment on a ticket

neo ticket comment [OPTIONS] --body <BODY> <TICKET>
Option Value Required Default Env Values Description
<TICKET> yes Ticket to act on, as ENG-7 or <workspace>/ENG-7
--body <BODY> yes Markdown comment body
--json no Print the created comment as JSON

Atomically claim a ticket (backlog/todo → in_progress, assigned to you).

Exactly one claimer wins; a lost claim exits non-zero with the server’s 409 — the agent loop’s mutual exclusion.

neo ticket claim [OPTIONS] <TICKET>
Option Value Required Default Env Values Description
<TICKET> yes Ticket to act on, as ENG-7 or <workspace>/ENG-7
--json no Print the claimed ticket as JSON

Release a claimed ticket: in_progress → todo, drop your assignment

neo ticket release [OPTIONS] <TICKET>
Option Value Required Default Env Values Description
<TICKET> yes Ticket to act on, as ENG-7 or <workspace>/ENG-7
--json no Print the released ticket as JSON

Record that a ticket tracks a repo-bound issue.

The direction is fixed: planning work tracks intake, never the reverse. The inverse (tracked_by) row is written by the server in the same transaction and is never created directly.

neo ticket track [OPTIONS] <TICKET> <ISSUE>
Option Value Required Default Env Values Description
<TICKET> yes Ticket doing the tracking, as ENG-7 or <workspace>/ENG-7
<ISSUE> yes Repo-bound issue being tracked, as acme/api#1526 or api#1526 (owner defaults to your handle). A bare #1526 is not accepted — a leading # is a comment to the shell
--json no Print the created link as JSON

Remove a ticket’s tracking link to a repo-bound issue.

Both rows of the pair go in one transaction.

neo ticket untrack [OPTIONS] <TICKET> <ISSUE>
Option Value Required Default Env Values Description
<TICKET> yes Ticket that was doing the tracking, as ENG-7 or <workspace>/ENG-7
<ISSUE> yes Repo-bound issue to stop tracking, as acme/api#1526
--json no Print the ticket’s links as they stand after the removal, as JSON ({links}) — the route itself answers 204 with no body