Skip to content
By Wayne Sun
Picture of Wayne Sun
Wayne Sun

Issue Commands ​

Read and write issue content across GitHub, GitLab, and Jira from custom agent scripts using fullsend issues get and fullsend issues post-comment.

When to use ​

The built-in agent pipeline handles comment posting automatically for GitHub-sourced events. Use these commands when:

  • A custom agent needs to post results back to Jira or GitLab.
  • An agent script needs to read issue content (title, body, labels, comments) from any tracker as structured JSON.
  • You need sticky comments (find-and-update-by-marker) on a non-GitHub tracker.

fullsend issues get ​

Reads an issue's title, body, labels, and comments from the specified tracker and prints them as JSON.

bash
fullsend issues get \
  --tracker github \
  --project owner/repo \
  --number 42

For Jira, --project is the project key and --number is the numeric issue ID (not the human-readable key):

bash
fullsend issues get \
  --tracker jira \
  --project PROJ \
  --number 101 \
  --jira-url https://myteam.atlassian.net \
  --jira-email you@example.com

Flags ​

FlagRequiredDescription
--trackerYes (unless config default set)Tracker backend: github, gitlab, or jira
--projectYesProject identifier: owner/repo (GitHub/GitLab) or project key (Jira)
--numberYesIssue number (must be a positive integer)
--tokenNoAPI token (default: env var per tracker)
--jira-urlJira onlyJira instance URL (default: $JIRA_BASE_URL)
--jira-emailJira onlyJira user email for auth (default: $JIRA_USER_EMAIL)
--fullsend-dirNoPath to .fullsend config directory (sources defaults from its config.yaml when flags are omitted)

fullsend issues post-comment ​

Posts a comment with a sticky marker on an issue. On re-runs, finds the existing comment by its marker and its own author (see Trust model) and edits in-place. By default, old content is collapsed into <details> blocks to preserve history; set keep_history: false in config.yaml (or pass --keep-history=false) to replace the body with no history. This prevents comment flooding on re-runs. For GitHub and GitLab, the marker is embedded as an invisible HTML comment in the body. For Jira, the marker is stored as a comment entity property (Jira has no HTML comments, so a body-embedded marker would be visible to users).

bash
echo "Triage complete. See PR #99." | fullsend issues post-comment \
  --tracker jira \
  --project PROJ \
  --number 101 \
  --marker "<!-- fullsend:triage-agent -->" \
  --jira-url https://myteam.atlassian.net \
  --jira-email you@example.com

Flags ​

FlagRequiredDescription
--trackerYes (unless config default set)Tracker backend: github, gitlab, or jira
--projectYesProject identifier: owner/repo (GitHub/GitLab) or project key (Jira)
--numberYesIssue number (must be a positive integer)
--markerYesSticky marker for idempotent updates (e.g. <!-- fullsend:my-agent -->). GitHub/GitLab: hidden HTML comment in body. Jira: comment entity property.
--resultNoPath to comment body file, or - for stdin (default: -)
--tokenNoAPI token (default: env var per tracker)
--jira-urlJira onlyJira instance URL (default: $JIRA_BASE_URL)
--jira-emailJira onlyJira user email for auth (default: $JIRA_USER_EMAIL)
--dry-runNoPrint what would be posted without posting or editing anything
--keep-historyNoAppend previous content as collapsed history blocks (default: true; set false to replace in-place)
--only-if-existsNoUpdate an existing comment with this marker but never create one. Use it for an all-clear result, so a findings comment from an earlier run is updated in place (the old findings are kept as collapsed history unless --keep-history=false) while a clean first run posts nothing. Only a comment whose author is exactly the identity posting matches; if that identity cannot be resolved, the command fails without posting.
--fullsend-dirNoPath to .fullsend config directory (sources defaults from its config.yaml when flags are omitted)

Jira marker storage ​

For --tracker jira, the --marker value is stored as an invisible comment entity property rather than embedded in the visible comment body. Jira's ADF format has no HTML comment equivalent, so body-embedded markers would be visible to users. Because the marker lives in a property, character restrictions do not apply — any characters valid in the --marker flag are fine for Jira.

Config-based default tracker ​

Set a default tracker in .fullsend/config.yaml to avoid passing --tracker on every invocation:

yaml
tracker: jira

Then pass --fullsend-dir .fullsend (or let the agent pipeline supply it). An explicit --tracker flag overrides the config default. See Layered Config Reference for how the tracker field resolves through the config overlay chain.

Trust model ​

For GitHub and GitLab, where markers are hidden HTML comments in the body, an existing comment is edited only when it carries the marker and its author is exactly the identity the command posts as. A comment anyone else wrote with the same marker is ignored, never edited. If that identity cannot be resolved after a short retry, the command fails with an error naming the cause and posts or edits nothing, with or without --only-if-exists; rerun it. Posting a new comment instead would leave the earlier one behind with content no later run updates.

For Jira, markers are stored as comment entity properties, which require comment-edit permissions to set — body-text injection alone cannot spoof a marker. Do not use this command where untrusted users have comment-edit permissions on your Jira project.

Environment variables ​

VariableTrackerDescription
GH_TOKEN or GITHUB_TOKENGitHubGitHub API token
GITLAB_TOKENGitLabGitLab API token
JIRA_TOKENJiraJira API token
JIRA_BASE_URLJiraJira instance URL
JIRA_USER_EMAILJiraEmail for Jira Cloud Basic auth

See also ​