Skip to content

💬 Comments

Four verbs for the conversation on an issue: add writes one, list reads the thread, edit rewrites one by id, delete removes one. Comment bodies are ADF — pass Markdown for convenience, pre-flight it with adf convert, or send native ADF JSON for exact control. JSON examples below show the data block only; the envelope wrapper and exit codes live on Output, and each command links to its reference page for the full flag and field tables.

comment add

Write one comment to one or more issues. Supply the body as --markdown (converted to ADF on the way out) or --json-input pointing at a native ADF JSON file — the two are mutually exclusive. The body runs through the validate-and-encode pipeline before submission; --dry-run previews the validated ADF and never contacts Jira.

jira issue comment add PROJ-123 --markdown "Deployed to staging."
jira issue comment add PROJ-1..10 -p 4 --markdown "Release note"
jira issue comment add PROJ-123 --json-input ./comment.json
jira adf convert --input notes.md --output=compact | jira issue comment add PROJ-123 --json-input -
jira issue comment add PROJ-123 --markdown "Internal note." --visibility-role Developers
jira issue comment add PROJ-123 --markdown "Draft." --dry-run --output=json
  1. add takes multiple keys — separate arguments, comma lists, or A..B ranges. The same body and visibility are applied to each. -p / --parallelism fans the writes out (default 1, max 16).

The data.comment object carries the created comment with snake-case keys; the body is the native ADF document as Jira stored it:

{
  "issue": "PROJ-123",
  "comment": {
    "id": "10244",
    "body": { "type": "doc", "version": 1, "content": [ { "type": "paragraph", "content": [ { "type": "text", "text": "Deployed to staging." } ] } ] },
    "author": { "account_id": "712020:…", "display_name": "John Doe", "email_address": "john.doe@example.com" },
    "update_author": { "…": "same shape as author" },
    "visibility": null,
    "created": "2026-05-27T07:13:03.338-0400",
    "updated": "2026-05-27T07:13:03.338-0400"
  },
  "dry_run": false
}

A single key returns the data above; multiple keys return ordered data.results[], each with ok and either the per-issue data or an error.

Legacy shorthand

jira issue comment PROJ-123 --markdown "…" (no subcommand) still works as an alias of comment add and builds an identical request.

Full flags & output fields →

comment list

Read the thread, or find a comment id before editing or deleting. list takes the same key lists and ranges as issue view. --limit sets the page size (default 50); --all walks every page until Jira reports the last one.

jira issue comment list PROJ-123
jira issue comment list PROJ-123 --all
jira issue comment list PROJ-1..10 -p 4
jira issue comment list PROJ-123 --output=json

Human output is one row per comment, newest pages last:

Comments  (2 comments)
#10244    John Doe       2026-05-27T07:13:03.338-0400  Deployed to staging.
#10245    John Doe       2026-05-27T07:13:03.697-0400  Rollout complete.

The JSON data carries each comment with its native ADF body; the pagination block rides in meta.pagination with the same camelCase shape every paginated command uses:

{
  "data": {
    "comments": [
      { "id": "10244", "body": { "type": "doc", "version": 1, "content": [ "…" ] }, "author": { "…": "…" }, "update_author": { "…": "…" }, "visibility": null, "created": "…", "updated": "…" }
    ]
  },
  "meta": {
    "pagination": { "startAt": 0, "maxResults": 50, "total": 2, "isLast": true }
  }
}

Multiple keys return data.results[]; each successful entry's data holds that issue's comments, a per-key pagination block in the same shape, and any per-key warnings.

Bodies round-trip losslessly

body is the document exactly as Jira stores it — mentions keep their accountId, status lozenges and cards survive — so it can be fed straight back to comment edit via --json-input, or reviewed as Markdown with adf render. Human output flattens each body to a one-line preview for display only.

Lossy Markdown renderings surface as warnings

A comment containing constructs with no Markdown spelling is listed under warnings[] (type: adf-lossy-comment) naming them — the JSON body is unaffected; the warning concerns the human preview and any Markdown projection you apply. If --all stops on a rate limit, meta.pagination.isLast stays false, nextCursor carries the resume offset, and a rate-limit-during-paginate warning is added.

Full flags & output fields →

comment edit

Rewrite one comment by id — edit KEY COMMENT_ID is single-target. Run comment list first to find the id. The replacement body takes the same --markdown / --json-input pair as add, and visibility can be replaced (--visibility-role / --visibility-group) or removed (--clear-visibility). --dry-run previews the validated body and visibility change without contacting Jira.

jira issue comment edit PROJ-123 10042 --markdown "Updated: rollout complete."
jira issue comment edit PROJ-123 10042 --markdown "Now public." --clear-visibility
jira issue comment edit PROJ-123 10042 --json-input ./comment.json --dry-run

A live edit returns the updated comment under data.comment — the same shape as comment add.

Full flags & output fields →

comment delete

Remove one comment by id — delete KEY COMMENT_ID is single-target. --dry-run previews the deletion and never contacts Jira.

jira issue comment delete PROJ-123 10042 --dry-run
jira issue comment delete PROJ-123 10042 --force

The data block confirms the removal:

{ "comment_id": "10042", "deleted": true }

Destructive — --force required when headless

A live delete in headless, agent, or --no-input mode must pass --force, or the command errors before calling Jira. An interactive terminal is prompted to confirm when --force is omitted.

Full flags & output fields →

See also

  • Reading issues — view, list, and mine
  • ADF — the comment-body document format
  • Output — the JSON envelope and exit codes