Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
{
"name": "bitwarden-atlassian-tools",
"source": "./plugins/bitwarden-atlassian-tools",
"version": "2.5.0",
"version": "2.6.0",
"description": "Atlassian access via MCP server with deep Jira issue research skill, JQL search, Confluence pages, CQL search, attachments, and opt-in Jira write tools"
},
{
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ A curated collection of plugins for AI-assisted development at Bitwarden. Enable
| [bitwarden-ai-telemetry](plugins/bitwarden-ai-telemetry/) | 1.1.0 | Claude Code hooks emitting metadata-only AI-usage telemetry (identity, git-linkage, MCP) via OTLP |
| [bitwarden-tech-lead](plugins/bitwarden-tech-lead/) | 3.0.0 | Tech lead for technical planning, architecture coherence, and surfacing patterns to Technical Strategy Ideas |
| [bitwarden-shepherd](plugins/bitwarden-shepherd/) | 1.0.1 | Champion of a technical strategy β€” shepherds a TSI through evaluation into the funnel, then through to adoption |
| [bitwarden-atlassian-tools](plugins/bitwarden-atlassian-tools/) | 2.5.0 | Atlassian access via MCP server with deep Jira issue research skill and opt-in Jira write tools |
| [bitwarden-atlassian-tools](plugins/bitwarden-atlassian-tools/) | 2.6.0 | Atlassian access via MCP server with deep Jira issue research skill and opt-in Jira write tools |
| [bitwarden-code-review](plugins/bitwarden-code-review/) | 1.13.1 | Autonomous code review agent following Bitwarden engineering standards with GitHub integration |
| [bitwarden-delivery-tools](plugins/bitwarden-delivery-tools/) | 2.4.0 | Delivery lifecycle skills: initiative funnel navigation, work transitions, tech breakdowns and task decomposition, commits, PRs, preflight, labeling |
| [bitwarden-designer](plugins/bitwarden-designer/) | 0.1.0 | Product designer persona: Code of Conduct and 30/60/90 critique, critique facilitation; dispatches into bitwarden-design-tools |
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "bitwarden-atlassian-tools",
"version": "2.5.0",
"version": "2.6.0",
"description": "Atlassian access via MCP server with deep Jira issue research skill, JQL search, Confluence pages, CQL search, attachments, and opt-in Jira write tools",
"author": {
"name": "Bitwarden"
Expand Down
6 changes: 6 additions & 0 deletions plugins/bitwarden-atlassian-tools/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ All notable changes to the Bitwarden Atlassian Tools plugin will be documented i
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [2.6.0] - 2026-08-04

### Added

- **`filing-jira-tickets` skill** β€” files work items that stand on their own: reads the target project's create screen first, translates work into real ticket titles and criteria placed in whatever field the project provides, previews each payload and takes approval before writing it, then wires and verifies dependency links. Approval is the default and only an explicit instruction skips it.

## [2.5.0] - 2026-08-03

### Added
Expand Down
13 changes: 13 additions & 0 deletions plugins/bitwarden-atlassian-tools/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,19 @@ Features:
- Automatic Confluence page follow-through from remote links
- Context budget guidance and graceful degradation

### `filing-jira-tickets`

Files Jira work items that stand on their own. Reads the target project's create screen before drafting, so no project's field layout is assumed, previews each payload before writing it, then wires and verifies dependency links. Triggered by intent to create or link tickets (e.g., "file a bug for this", "create a story for this work", "wire the blocked-by relationship").

Features:

- Discovers issue types, required fields, and allowed values per project rather than hardcoding them, which matters because Bitwarden's projects differ (PM and SM expose an Acceptance criteria field, QA and VULN do not; VULN has no Story type; PLT's only creatable type is `Platform Initiative`)
- Dry-run preview of the exact payload before every live write
- Approval required before each create, unless explicitly told to skip it
- Role-named link arguments (`blockerKey`, `blockedKey`) so dependency direction cannot be inverted

Live creation requires `ATLASSIAN_JIRA_WRITE_TOKEN`; without it the skill can still draft and preview.

## Requirements

- Claude Code with MCP support
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
---
name: filing-jira-tickets
description: File Jira work items that stand on their own, with real ticket titles, acceptance criteria in whatever field the target project provides, and verified dependency links. Reads the target project's create screen first, so no project's field layout is assumed.
when_to_use: Use when the user is ready to create one or more Jira work items and wants them filed correctly. Phrasings like "file a bug for this", "create a story for this work", "open a spike", "file these tickets", "link these two tickets", or "wire the blocked-by relationship". Also use when another skill hands off a set of drafted tickets to create. Do not use for reading or researching existing issues (that is researching-jira-issues), or for editing tickets that already exist.
allowed-tools: Read, mcp__plugin_bitwarden-atlassian-tools_bitwarden-atlassian__get_create_fields
Comment thread
SaintPatrck marked this conversation as resolved.
---

# Filing Jira Tickets

Tickets get read outside the context that produced them, so each one has to stand alone.

Live tickets are awkward to unwind, so `create_issue` and `link_issues` both default to a dry run that returns the exact payload without sending it. Preview before every live write. A live write takes an explicit `dryRun: false`.

Nothing gets created without approval unless you are explicitly told to skip it. See Step 3.

## Step 1: Read the target project's create screen

Bitwarden files into many projects and they do not share a shape. PM and SM expose an Acceptance criteria field; QA, VULN, and PLT do not. VULN has no Story type. PLT's only creatable type is `Platform Initiative`. Never assume a field id, a required field, or that an issue type exists.

Call `get_create_fields` with the project key, and again with the intended issue type. It returns the project's creatable types, then every field on that type's create screen with its id, whether it is required, and its allowed values.

- The type is not in the list: pick from what the project offers, or ask the user which one they want.
- The tool reports it cannot read the create screen (a 404): this means the project key does not exist, or the user lacks create permission there β€” the tool cannot tell which. Re-check the project key for a typo before concluding the latter; if it's correct, tell the user they likely lack create permission and stop. Do not guess at a different project.

**Completion criterion:** for the target project and issue type, a list of the required fields and the ids of any optional fields this work should populate.

## Step 2: Draft the ticket

Translate the work into fields. Do not paste in whatever the source document said.

- **Title.** Imperative verb, outcome, and area: `Add CSV export to the item list (web)`. Match the style of sibling tickets under the same parent, and check one if you are unsure.
- **Description.** One short paragraph of the actual work, plus any caveat specific to this ticket. No lineage boilerplate such as `Part of PM-1234`, and no path to a source document; the parent link already conveys that. Spell out shorthand rather than using symbols.
- **Acceptance criteria.** If Step 1 showed the project has a criteria field, pass the criteria there through `fields`, keyed by that field's id, as a single string of Gherkin (`Scenario`, `Given`, `When`, `Then`, `And`) β€” that field is plain text, so embedded line breaks render fine. If the project has no such field, put the criteria in the description instead: pass each Gherkin line as its own `descriptionParagraphs` entry, since each entry becomes one paragraph and a paragraph has no line-break node of its own. Tell the user that is what you did. Do not invent a field id.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎨 SUGGESTED: "that field is plain text" is only verified for PM's customfield_10192, yet it is stated for any project's criteria field.

Details and fix

adf-build.ts scopes the claim narrowly: "the PM project exposes Acceptance criteria (customfield_10192) as a plain textarea, so Gherkin is sent as a string and needs no ADF at all." If another project's criteria field is a rich-text field, a bare Gherkin string is the wrong payload type and the create fails.

get_create_fields already renders type <schema.type> for every field, so Step 1 has the answer. Suggested tightening:

If Step 1 showed the project has a criteria field, check the type it reported. For a string or text field, pass the criteria through fields keyed by that field's id as a single string of Gherkin (Scenario, Given, When, Then, And); line breaks render fine there. If it reports a rich-text (doc) type, a bare string will be rejected β€” put the criteria in the description instead and tell the user.

Rationale: everywhere else this skill refuses to assume project shape ("Never assume a field id, a required field, or that an issue type exists"), and Step 1 is already the authority on the type. This closes the one place where a shape is assumed.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Speculative failure. If/when this manifests as an issue it will be addressed at that time.

- **Required fields.** Supply every one Step 1 reported. Where a value is a business judgement rather than something derivable from the work, ask the user and offer the allowed values Step 1 returned. Do not guess, and do not pick the first option.
- **Labels.** Only what the user asked for.

**Completion criterion:** a drafted payload per ticket that satisfies every required field Step 1 reported.

## Step 3: Preview, approve, create

For each ticket, in the order given:

1. Dry-run it.
2. Verify the tool's raw output against Step 1: every required field present, criteria in the field Step 1 identified (or in the description if the project has none), parent correct, title makes sense to someone who has not read the source material.
3. Show the user a plain-language preview: title, full description text, full acceptance criteria, parent, labels.
4. Get approval on that preview. Then create it with `dryRun: false` and record the returned key.

**Approval before every create is the default.** Skip it only when explicitly told to file without approval.

If a create fails naming a field, re-read Step 1 for that project instead of guessing at the fix.

**Completion criterion:** every requested ticket previewed, approved, and created, with each returned key recorded.

## Step 4: Wire dependency links

Linking is reversible, so this step can run as a batch once the tickets exist.

- A hard dependency, where one item must land before another can start, is `Blocks`. Soft or ordering-only is `Relates`.
- For `Blocks`, pass `blockerKey` for the item that must land first and `blockedKey` for the item waiting on it. The tool maps those onto Jira's inward and outward sides internally, so the direction cannot be inverted by getting the argument order wrong.
- `link_issues` reads the link back itself and reports whether it verified. If it reports it could not verify, tell the user and point them at Jira's Linked Issues panel directly β€” `get_issue`'s output has no links section, so it cannot confirm this for you.

**Completion criterion:** every relationship whose target ticket exists is created and verified. Relationships pointing at work that does not exist yet are reported back to the user, not dropped.
Loading