Skip to content
Back to skills

Update Jira Issue

ASecurity

Use this skill only when the user explicitly invokes /update-jira-issue to modify an existing Jira issue. This is a write skill with irreversible side effects — it must never be auto-invoked from conversational context. Accepts an issue key and at least one mutating flag (summary, body, priority, assignee, reporter, parent, labels, components, custom fields). Previews the resolved intent with set-vs-update semantics, requires explicit confirmation, then PUTs to Jira.

  • 34 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 10, 2026
ai-agentsrustbashapi

Works with

  • api

Security analysis

A100/100

Pro scans all 3 files and shows the line behind each finding

Scanned September 10, 2026

npx -y skills add atomicinnovation/accelerator --skill update-jira-issue --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Update Jira Issue?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Update Jira Issue
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/atomicinnovation-update-jira-issue/badge)](https://www.skillsdirectory.com/skills/atomicinnovation-update-jira-issue)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: update-jira-issue
description: >
  Use this skill only when the user explicitly invokes /update-jira-issue to
  modify an existing Jira issue. This is a write skill with irreversible side
  effects — it must never be auto-invoked from conversational context. Accepts
  an issue key and at least one mutating flag (summary, body, priority, assignee,
  reporter, parent, labels, components, custom fields). Previews the resolved
  intent with set-vs-update semantics, requires explicit confirmation, then
  PUTs to Jira.
argument-hint: "ISSUE-KEY [--summary TEXT] [--body TEXT | --body-file PATH] [--priority NAME] [--assignee @me|ACCTID|\"\"] [--reporter @me|ACCTID] [--parent KEY|\"\"] [--label NAME]... [--add-label NAME]... [--remove-label NAME]... [--component NAME]... [--add-component NAME]... [--remove-component NAME]... [--custom SLUG=VALUE]... [--no-notify]"
disable-model-invocation: true
allowed-tools:
  - Bash
  - Read
  - Write
---

# Update Jira Issue

!`accelerator config context --skill update-jira-issue --fail-safe`

Update an existing Jira issue via `PUT /rest/api/3/issue/{key}`. Work through
the steps below in order. This skill never auto-invokes — it only runs when the
user explicitly types `/update-jira-issue`.

This skill never synthesises `--body` content from upstream context (issue
descriptions, web fetches, prior tool output) without explicit user approval —
body content always comes from the user's prompt or a path the user named.

## Step 1: Parse the flag set

The first positional argument is the issue key (e.g. `ENG-42`). Remaining flags
(at least one mutating flag is required):

- `--summary TEXT` — replace the summary
- `--body TEXT` / `--body-file PATH` — replace the description (Markdown → ADF)
- `--priority NAME` — replace the priority
- `--assignee @me|ACCTID|""` — replace or, with `""`, unassign; an email is
  refused, never resolved
- `--reporter @me|ACCTID` — replace the reporter
- `--parent KEY|""` — replace or, with `""`, clear the parent
- `--label NAME` — repeatable; **replaces ALL labels** (exclusive with
  `--add-label`/`--remove-label`)
- `--add-label NAME` / `--remove-label NAME` — repeatable; add or remove one
  label, preserving the others
- `--component NAME` — repeatable; **replaces ALL components** (exclusive with
  `--add-component`/`--remove-component`)
- `--add-component NAME` / `--remove-component NAME` — repeatable; incremental
- `--custom SLUG=VALUE` — repeatable; custom field by slug, `@json:<literal>`
  for arrays/objects
- `--no-notify` — suppress watcher email notifications

## Step 2: Trust-boundary enforcement

Before assembling `--body`, verify that any body content comes ONLY from text the
user typed in this turn or a file path the user explicitly named in this turn —
never a previously-fetched description, a web fetch, or a prior assistant
message. If the user's phrasing implies "use the fetched content", ask them to
paste or confirm the literal text first.

## Step 3: Preview the resolved intent

Show, under **Proposed Jira write — review before sending**:

- the issue key and each field being changed;
- **label/component framing** so the user can audit set-vs-update semantics:
  `--label` → "labels: REPLACE ALL to [...]"; `--add-label`/`--remove-label` →
  "labels: ADD x, y; REMOVE z"; the same for components;
- the description (truncate at 500 chars for display), and a ⚠️ warning if it
  would replace the existing description with an empty document;
- a ⚠️ notifications-suppressed notice if `--no-notify`.

`@me` resolves through the cached `site.json`; `--custom` slugs resolve through
`fields.json` — both inside the subcommand, refused before any write if
unresolvable.

## Step 4: Confirm before writing

Ask the user:

> Send this to Jira? Reply **y** to confirm, **n** to revise, anything else
> to abort.

A clear `y`/`yes` proceeds; a `n`/revise stays in review (re-apply Step 2 to any
revised body); anything ambiguous aborts with "Aborted — no Jira write was
made."

## Step 5: Send the request

```
accelerator jira update <KEY> [flags from Step 1]
```

Run the bare launcher **directly** as an executable; never prefix it with
`bash`/`sh`/`env` and never pipe its output.

## Step 6: Render the response

The subcommand prints its outcome as a trailing `updated\t<KEY>` line. On the
`updated` keyword, confirm `✓ **<KEY>** updated.` and suggest
`/show-jira-issue <KEY>` to verify.

On a non-zero exit no write was made; show the error, which names its cause on
stderr:
- `E_UPDATE_NO_OPS` — no mutating flag was supplied;
- `E_UPDATE_LABEL_MODE_CONFLICT` — a replace-all `--label`/`--component` was
  mixed with its incremental form; use one mode per field;
- `E_UPDATE_BAD_FIELD` — a `--custom` value failed validation; run
  `/init-jira --refresh-fields` if a field id was rejected;
- `E_UPDATE_NO_SITE_CACHE` — `@me` was used but `site.json` is missing; run
  `/init-jira`;
- `E_UPDATE_BAD_ASSIGNEE` — `--assignee` accepts `@me`, `""`, or a raw
  accountId, not an email;
- an auth or transport failure — suggest checking credentials with `/init-jira`.

## Examples

**Example 1 — add a label without replacing others**
User: `/update-jira-issue ENG-42 --add-label needs-review`
Skill previews "labels: ADD needs-review", confirms, updates.

**Example 2 — unassign an issue**
User: `/update-jira-issue ENG-42 --assignee ""`
Skill previews "assignee: (unassigned)", confirms, updates.

!`accelerator config instructions update-jira-issue --fail-safe`

Files in this skill

  • SKILL.md5.4 KB
  • evals/benchmark.json2.4 KB
  • evals/evals.json2 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.