netresearch/jira
Comprehensive Jira integration with auto-detection of issue keys
Changelog
All notable changes to the Jira Integration Skill will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
3.29.1 - 2026-08-28
Documentation
expand=transitions.fieldsunder-reports theresolutionfield: a transition that reports it absent may still accept--resolutionand set it. Attempt the transition with--resolutionand treat only the "cannot be set" error as a rejection (intent-verbs)
3.29.0 - 2026-08-27
Changed
jira-qa-gatherprints the description and every comment (all pages, chronological, with author and date — the same rendering asjira-issue work) in its text output, so a QA reviewer no longer needs a secondjira-issue work KEYcall per ticket;--no-bodyrestores the metadata-only shape, and--jsongains adescriptionkey. The shared rendering moved tolib/render.pyjira-link create FROM TOwithout--typenow fails with a usage error that shows the--type Relatesexample and points tolist-types, instead of the bareMissing option '--type' / '-t'
3.28.0 - 2026-08-17
Added
- Every command that posts mention-capable wiki markup verifies
[~username]mentions against Jira inside the posting call —jira-comment add/edit,jira-transition do --comment,jira-worklog add --comment, and the--descriptionofjira-create issue/jira-issue update. An unknown username aborts with candidate suggestions in the form that actually notifies ([~name]on Server/DC,[~accountid:...]on Cloud, where a plain username mention can never notify and is always flagged); mentions inside{code}/{noformat}blocks and backslash-escaped literals are ignored; auth/transport failures surface as themselves, never as "unknown user". Skip with--no-verify-mentions(#199) jira-issue get/work/qa,jira-comment list,jira-worklog listandjira-boardprint the technical identifier next to each display name (Server/DC username,accountid:<id>on Cloud), so ticket participants can be mentioned or assigned without a separate user lookup (#199)
Fixed
lib.client.resolve_assigneeand the newlib.users.find_users(now also used byjira-user.py's fallbacks) search users withusername=on Server/DC (query=only on Cloud) — the previous unconditionalquery=returned the library's error string on Server/DC, so email identifiers only ever resolved through the raw fallback (#199)resolve_assigneeresolves an exact username first and accepts a search result only on an exact field match or a single unambiguous candidate; with several fuzzy candidates it falls back to the raw identifier so Jira rejects it visibly instead of silently assigning an arbitrary user (#199)
3.27.1 - 2026-08-14
Fixed
jira-createaccepts-for--descriptionto read the description from stdin, matchingjira-issue update(#196)
[3.27.0] - 2026-08-13
Documentation
jira-communication:references/comments.mddocuments how to verify a comment actually renders as intended —GET .../comment/<id>?expand=renderedBodyand what to grep for (<del>= strikethrough trap fired, literal backslash = escape leaked,-= correctly escaped dash). A 2xx on add/edit proves the write, not the rendering.
Documentation
AGENTS.md: the release workflow goes through a release PR now —mainrequires pull requests, so the old direct-push flow only worked via owner bypass. The steps also name all four version surfaces (.claude-plugin/plugin.json,plugin.json, bothSKILL.md), require the signed annotated tag on the verified merge commit (the old step 7 showed a lightweight tag), and describe the actual release artifacts (zip + tar.gz per package, checksums with Sigstore signature, SLSA provenance).
[3.26.0] - 2026-08-13
Fixed
jira-syntax:validate-jira-syntax.shno longer fails wholesale on the hybrid template files (#190). Files containing Markdown code fences are wrappers around a Jira-markup payload: the untagged fences are now extracted and validated as Jira markup, while language-tagged fences (bash usage examples) and wrapper prose are skipped. Draft files without fences keep the full strict treatment, sotemplates/*.mdvalidate their actual payload and the documented build check exits 0.
Added
-
jira-communication: the pre-post markup lint (lib/markup.py, used byjira-comment.py add/edit) flags flag-like tokens (--strict) outside code blocks (#189) — Jira parses-text-as strikethrough, even inside{{...}}monospace, so a pair of CLI flags strikes through everything between them. Escaped dashes (\-) pass; em/en-dash typography and single-dash options stay out of scope. Same rule as thejira-syntaxshell validator;--forcesemantics unchanged. -
jira-syntax:validate-jira-syntax.shwarns on flag-like tokens (--strict) outside{code}/{noformat}blocks. Jira parses-text-as strikethrough, the opening dash needs only whitespace (or a{{monospace opener) before it, and text effects apply inside{{...}}monospace, so a pair of CLI flags in prose strikes through everything between them. Backslash-escaped dashes (\-) pass.
Documentation
jira-syntax:references/jira-syntax-quick-reference.mddocuments the dash-strikethrough trap for CLI flags and the escape —{{\-\-strict}}renders as literal--strict, each\-reaching the rendered HTML as a-entity (verified against the Jira Server 9.12 wiki renderer).jira-communication:references/troubleshooting.mdcorrects the task-checkbox claim — inline{task}checkboxes ARE toggleable via the API; the old claim had probed the wrong endpoint (#187).jira-communication:references/troubleshooting.mddrops its internal-skill pointer (public repo), inlines the curl gotchas, and makes the 204 wording precise.
3.25.1 - 2026-08-12
Fixed
- List jira-create.py in the detected-issue reminder (hook)
3.25.0 - 2026-08-08
Added
- Add delete subcommand; report assignee and empty link sets in qa-gather (worklog)
- Add Agent Plugins 1.0.0 portable manifest (manifest)
Fixed
- Pass limit= to user_find_by_user_string (jira-user)
- Declare the split license in both manifests (license)
3.23.1 - 2026-07-30
Fixed
jira-communication:jira-create.py project --bootstrap-issuesprinted its✓ Created KEY-1: Projektmanagementline to stdout even under--json/--quiet, so the JSON payload failed to parse (json.loads→ "Extra data") and--quietemitted two lines instead of the project key._create_bootstrap_issuesaccepted the context dict but never consulted it; it now suppresses the line in both modes. Covered by two regression tests.
Documentation
jira-communication:references/troubleshooting.mddocuments both--json | jqfailure modes.jq: parse error: Invalid numeric literal at line 1, column 10isuv run's cold-cacheInstalled N packagesnotice reachingjq— uv writes it to stderr, so only a merged pipe (2>&1, a wrapper, or a harness capturing combined output) breaks, withgrep -v '^Installed'as the fallback.Cannot index array with stringis the payload shape: list-style subcommands emit a bare array, so the path is.[], never.issues[]. Includes a per-subcommand array-vs-object table (watchers listis the one list subcommand that wraps its result).jira-communication:references/watchers.mdshipped a broken bulk-watch pipeline (jq -r '.issues[].key'), which exits 5 against a bare array. Corrected to.[].key.jira-communication: the--resolutionrule is no longer unconditional. Workflows whose terminal transition screens omit the field reject--resolutionoutright, and a follow-up--fields-jsonupdate fails on the edit screen for the same reason. Documented handling: prefer another terminal transition whose screen carries the field, otherwise transition without--resolutionand verify withresolution is EMPTYrather than assuming the workflow post-function fired. Covered inSKILL.mdandreferences/intent-verbs.md, cross-linked from the generic "Field 'xyz' cannot be set" section inreferences/troubleshooting.md.jira-communication:references/versions.mdrecords that renaming a version propagates to every issue carrying it — issues hold a reference by numeric ID — so the rolling-placeholder release pattern needs no per-issuefixVersionspass. Verified against a sandbox project: the issue'sfixVersionsname changed with the version untouched by any issue edit. Also documents the sharp edge that the old name does not merely stop matching in JQL, it becomes invalid (The value '<old>' does not exist for the field 'fixVersion', non-zero exit), so saved filters keyed on the old name break loudly rather than returning nothing.jira-communication:references/versions.mdalso warns that versioncreate/updaterequire project-admin rights, while assigning an existing version to an issue is an ordinary issue edit. A plain project member can do the latter and not the former, and the failure surfaces mid-procedure.jira-communication:references/issue-editing.md's labels section generalised to all array-valued fields.jira-issue.py updatehas no append path (Jira'supdateverb withadd/removeis not exposed), sofixVersions,versionsandcomponentsare replaced wholesale by--fields-json; onlylabelshas incremental--add-label/--remove-label.jira-communication:references/links.mddropped its "Real-world reference" section, which pointed at the internal-onlynetresearch-jiraskill (via a dead GitHub URL). A public, general-purpose skill should not send readers to a reference they cannot reach; the direction semantics it corroborated are already documented in full here. Same policy applied to the two other pointers at the internal-only skill: the routing aside inreferences/intent-verbs.mdis now phrased generically, and the_create_bootstrap_issuesdocstring injira-create.pykeeps the convention's name without the unreachable file path.
3.23.0 - 2026-07-27
Changed
jira-communication:jira-create.py project --bootstrap-issuesnow creates only the XXX-1 config-hub issue, using this Jira instance's dedicated "Issue Number One" issue type (summary "Projektmanagement") instead of a plain Task — falls back to Task if a--from-projecttemplate's issue type scheme doesn't include it. No longer auto-creates a PM Epic or Deployment Epic (dropped as unnecessary bootstrap overhead — create them by hand if a project actually needs them).
3.22.1 - 2026-07-26
Fixed
jira-communication:jira-create.py project --bootstrap-issuesfailed to create both Epic-type issues ("Epic Name is required") — this Jira instance requires the Epic Name custom field, which wasn't being set. Now populated automatically from the issue summary.jira-communication:jira-create.py projectnow checks whetherKEY-1already resolves to an issue before creating — reusing an old, renamed-away project key silently skips Jira's issue numbering (the old key's redirect is permanent), so the new project's first bootstrap issue would silently NOT beKEY-1. Aborts with a clear error unless--forceis passed. Discovered during a real project creation where the key had been used by a project since renamed to a different key back in 2012.
3.22.0 - 2026-07-25
Added
jira-communication:jira-create.py projectcreates a new Jira project by copying the permission/notification/workflow schemes from an existing project, with an optional--bootstrap-issuesflag for the XXX-1/2/3 (config hub, PM epic, deployment epic) convention (#165).jira-communication: newtempo-account.pyscript (customer create,account create,account link) wrapping Tempo Accounts management (#165).
Documentation
jira-syntax: documented that validation gates the post — run it as its own step, never chained with the posting command (#164).jira-communication: documented clearing a field via--fields-jsonwith an explicitnull(typed flags like--assignee ""are a no-op) (#164).
3.21.1 - 2026-07-18
Documentation
jira-communication:issue-editing.md's reference-index entry now points to--fields-jsonfor custom-field updates, so it is found before guessing a non-existent--fieldflag (#158).
3.21.0 - 2026-07-16
Added
jira-communication: wiki-markup lint flags inline emphasis (*bold*,_italic_) glued mid-word, where Jira does not render it (#160).
Documentation
jira-communication: documented thatjira-search.pyquery-subcommand options (-f,-n,--order-by) must come afterquery, not before it (#161).
3.20.0 - 2026-07-13
Added
jira-communication: wiki-markup lint flags||(header separators) inside table data rows, with escaped-pipe handling (#153).
Changed
jira-syntax: trimmed generic content from the quick-reference; fixed TOC links and the inline-code placeholder (#156).
Documentation
jira-communication: skill triggers on keyless Jira intent ("create/find a ticket", "pick a project"); clarified MCP-connector access (#154).jira-syntax: noted PowerShell has no code-block lexer; added validator hint (#155).
3.19.0 - 2026-07-06
Added
jira-communication:jira-worklog-query.pygains--tempo-accountto query a customer/Tempo account's worked time (#149).
3.18.3 - 2026-07-01
Documentation
- All skills: added a "no editorializing" rule for written output — commit messages, PR/MR descriptions, review comments, tickets, and chat state what changed, not how good it is (#150).
AGENTS.md: documented theatlassian-python-api >=3.41,<4pin rationale (no Jira Cloud test tenant) (#148).
3.18.2 - 2026-06-27
Fixed
hooks: the Jira-key guard no longer flagsCWE/CVE/encoding IDs orPROJ-123-style placeholders as real keys, and blocks thePROJ/EXAMPLE/AES/TLSprefixes (#146).
Documentation
jira-communication: checkjira-attachment downloadexit status instead of file size, and document its auth requirement (#145); document unassigning an issue (#144).jira-syntax: document the(/)and(x)status emoticons and checklist semantics (#141).
3.18.1 - 2026-06-24
Documentation
jira-communication: note the Jira Cloud[~accountId]mention form, transition-by-status-name, and[~mention]username gotchas (#140).jira-editing: epic-link is edit-screen-only; subtask↔standard conversion is via the UI "Convert to Issue" (#142).
3.18.0 - 2026-06-18
Added
jira-attachment download-all: bulk-download every attachment on an issue in one call, with per-file progress and resilient error handling (#134).jira-issue transition: tolerant, Unicode-safe transition-name matching — transitions resolve case- and whitespace-insensitively (and across Unicode normalisation forms) instead of requiring an exact label match (#136).
Fixed
jira-communication: surface the comment count and never render requested fields silently — when a field is requested but absent it is reported rather than dropped without notice (#127, #130).
Documentation
jira-syntax: clarified wiki-markup escaping rules and fixed table pipe (|) escaping in the reference (#133).jira-syntax: warn that a bare GitLab!Nreference renders as image markup in Jira wiki syntax (#138).
3.17.0 - 2026-06-11
Added
jira-comment add/edit: comments are now linted for wiki-markup problems before posting. The newlib/markup.pylint_wiki_markup()helper catches the most damaging authoring mistakes: block-markup tags ({code},{noformat},{quote},{panel}) used inline — these are block-level macros, so an unescaped tag with other text on the same line opens a real block mid-prose and swallows the rest of the line — plus unbalanced (odd-count) block tags and unclosed blocks. Escaped tags (\{code\}), inline-monospace lookalikes ({{code}}) and other tags inside an open block are ignored, matching the Jira Server 9.12 renderer. Findings abort the post with an explanatory error;--forceposts anyway and downgrades findings to warnings. (#131)validate-jira-syntax.sh: new error for block tags used inline (same rule as the comment lint; escaped\{code\}literals and{{code}}monospace lookalikes are stripped per line before testing), and a new warning for unescaped*inside{{...}}monospace blocks, which turns bold mid-token (e.g.{{jira-*backup-*}}renders "backup-" bold). Escape as\*.
Changed
validate-jira-syntax.sh: the unescaped-brace-inside-{{...}}check now skips backslash-escaped braces (\{\}), which render literally and are fine; the{code}language extraction and the tag-balance counts for{code}/{panel}/{noformat}/{quote}/{anchor}now ignore escaped literals (\{code\}) and inline-monospace lookalikes ({{code}}) — both are prose, not block markup.references/cross-project-refs.mdand the quick reference now document escaping (\{\}\*) as the primary fix for literal braces and*inside{{...}}monospace, verified against the Jira Server 9.12 wiki renderer; splitting into separate{{...}}references remains a fallback when escaping hurts readability.
3.16.0 - 2026-06-09
Added
jira-transition path KEY TARGET_STATUS: walk a multi-stage workflow to a target status in one call, instead of repeatinglist+doper stage. Runs thelist → pick → doloop internally. Because the Jira API only exposes transitions from the issue's current status, the walk is greedy rather than a full graph search: at each step it takes the target if directly reachable, else the single non-backward transition (names matchingreopen/cancel/reject/decline/abort/back, or targets already visited, count as backward); an ambiguous step stops and lists the options for an explicitdo.--resolution/--commentapply to the final transition only,--max-steps(default 10) caps the walk, and--dry-runpreviews the first step. Motivated by closing a ticket sitting deep in aQA → UAT → Ready for deployment → Resolved → Closedworkflow, which previously cost 8 round-trips. Documented inreferences/intent-verbs.md.
3.15.0 - 2026-05-28
Fixed
jira-search query,jira-qa-gather,jira-worklog-query: JQL search now works on Atlassian Cloud. Atlassian's CHANGE-2046 removed/rest/api/2/searchand/rest/api/3/searchfrom Cloud;atlassian-python-apihardcodesapi_version=2so itsjql()method failed with "The requested API has been removed" on every*.atlassian.netinstance.LazyJiraClient.jql()now overrides the library and calls the new cursor-paginated/rest/api/3/search/jqlendpoint directly on Cloud while Server/DC still goes through the library unchanged. The override translates cursor pagination (nextPageToken/isLast) back to thestartAt/totalshape the callers expect, so paginating loops keep terminating correctly on Cloud — no caller changes needed. Cloud detection usesis_cloud_url(client.url)(strict.atlassian.netmatch) rather than the library'scloudflag for cross-version robustness. Surgical override rather than bumpingatlassian-python-apito 4.x — the 4.x line still has open Cloud-pathway bugs and the project cannot verify against a Cloud tenant. Inefficiency caveat: each call drains pages from index 0 up tostart + limitbecause the new endpoint is cursor-based and we cannot resume from an offset, so deep pagination is O(N²) until upstream Cloud-awarejql()lands. Original fix by @rschmied in #107; pagination + Cloud-detection hardening in #112.
Changed
validate-jira-syntax.sh: the "Unsupported{code:<lang>}language" error now suggests the closest-fit valid language for common stumbles instead of always falling back to the full valid-languages list. Identifiers are matched case-insensitively (Dockerfile,Makefile,HCL,TypeScriptetc. all resolve). Recognised hints:hcl/tf/terraform/tofu→{code:none},dockerfile/containerfile→{code:bash}or{code:none},rust/rs→{code:none},kotlin/kt→{code:java}or{code:none},typescript/ts/tsx→{code:javascript}or{code:none},shell/zsh/fish/console→{code:bash}or{code:none},make/makefile→{code:none},ini/toml/conf/properties→{code:none},diff/patch→{code:none},go-template/gotmpl/jinja/jinja2→{code:none}. Unknown languages still get the full valid-languages list.
Added
jira-issue update --description / -d: typed flag for plain description edits — previously required--fields-json '{"description": "..."}'with its JSON-escaping fragility.--description -reads the body from stdin so multi-line wiki markup can be piped in without shell-escape gymnastics.references/issue-editing.mdupdated; the long-tail--fields-jsonroute remains for custom-field payloads.jira-issue work / qa / qa-fail / act: four single-call intent verbs that compose existing API endpoints (issue + comments + changelog + remote_links + transitions) into the right bundle for one specific intent — replacing the commonjira-issue get+jira-comment list2-call (or worse, with shell-side filtering, 5–6-call) pattern.work KEY— description + all comments + attachments + links (use when starting work on a ticket)qa KEY— description + handover bundle (comments around the most recent INTO_QA transition, before-or-after agnostic — empirically 80% of handover comments precede the transition click)qa-fail KEY— description + reviewer rejection comment + implementer scope/clarification context from the same QA windowact KEY— meta + available transitions (one call before transitioning, replaces meta-fetch + transition-list)- All verbs support
--json,--quietand the standard global flags;work,qa,qa-failalso support--truncate N(act has no body to truncate) - Status-set classification configurable per profile via
qa_status_names/working_status_names/resolved_status_names(or env vars). Defaults cover common single-stage and multi-stage QA workflows. Multi-stage progressions (QA→QA2,Review→UAT,QA→Acceptance) are correctly classified as forward, not as fail. - SKILL.md
## Auto-Triggerrewritten as an intent-routing table;references/intent-verbs.mddocuments the heuristics, status sets, and configuration.
lib/changelog.py:extract_status_transitions_with_authors(),classify_transition(),find_transition_window()helpers used by the intent verbs.lib/config.py:load_status_sets(profile=...)resolves the three status sets from profile fields, env vars, or built-in defaults.jira-link create:--source/--targetnamed aliases forFROM_KEY/TO_KEY.--source S --target T --type Xis equivalent tocreate T S --type X. Mixing positional with named forms is rejected. The named form is recommended when the direction matters (it always does) so the call-site reads as English instead of relying on positional convention.jira-link bulk-create: read a CSV (--from-csv PATH, or-for stdin) with headerfrom,to,typeand create one link per row, mirroring the same direction convention ascreate("TO does X to FROM").--dry-runpreviews each resolved sentence without POSTing.--skip-existingchecks the FROM ticket'sissuelinksand skips rows where a link of the same type already connects FROM and TO (either direction) — useful because Jira Server is not idempotent on link creation.--abort-on-error(default) halts on the first failed row;--continue-on-errorlogs and keeps going. Per-row output uses[N/M]indices, ends with acreated: K, skipped: S, failed: Fsummary, and the--jsonmode emits one JSON object per line plus a finalsummary: trueobject (JSONL). Link types are resolved once via a singleget_issue_link_types()call regardless of how many rows reference them.jira-link bulk-delete: delete many issue links by ID, either from a comma-separated--idslist or a file (--ids-file PATH,-for stdin). Each ID is fetched first so per-row output shows the affected issues ([101] TEST-2 ↔ TEST-1 (Blocks)). Same--dry-run,--abort-on-error / --continue-on-error, and JSONL summary semantics asbulk-create.jira-link invert: one-shot fix for a backwards link. Given--id N, fetches the link, deletes it, and re-creates it with FROM/TO swapped.--dry-runshowsWould invert: <current sentence> → <new sentence>. If the inverted POST fails, the script attempts to re-create the original; if that rollback also fails, it exits non-zero with anINCONSISTENT STATEerror referencing both directions and the original link ID so the human can fix it in the Jira UI.jira-search query --order-by "FIELD [ASC|DESC]": append anORDER BYclause to the JQL without editing the query string. Repeatable for multi-key sorts (--order-by "priority DESC" --order-by "created ASC"produces one comma-separatedORDER BY). Errors with exit 2 if the JQL already containsORDER BYand points at the embedded form as the natural alternative.references/jql-quick-reference.md: new top-level "Sorting (ORDER BY)" section near the top showing both equivalent forms (embedded vs. flag).
3.13.1 - 2026-04-30
Added
jira-syntax: validator now flags{code:LANG}whoseLANGis not in the Jira Server source-code formatter set, mirroring the server-side error and pointing at{code:none}. Quick reference replaces the vague "many more — check Jira documentation" line with the authoritative formatter list grouped by category, calls out the literalc#/c++form, and lists common identifiers that look valid but are not (typescript, rust, shell, yml, typoscript). (#94)
Fixed
jira-worklog list: extract plain text from Cloud ADF ({type, content}) comment payloads instead of rendering the raw dict'srepr();--truncateno longer raisesTypeErrorwhen slicing such a comment. Adds a sharedcomment_to_text()helper inlib/output.py(also used byjira-worklog-query.py) that normalizes None / Server-string / Cloud ADF dict comment shapes to text. (#92)jira-syntaxvalidator: switch ERRORS/WARNINGS counters to pre-increment so(( ))returns the new (non-zero) value — the post-increment form returned 0 on first call and trippedset -e, aborting the script before the summary printed and making warning-only runs exit with code 1.jira-syntaxvalidator: treat{code:language}as a placeholder warning rather than a hard error so the bundled templates (which intentionally ship the literal word "language" as a fill-in) still run cleanly.jira-syntaxvalidator: use Bash built-in[[ ]]pattern matching for the{code:LANG}membership test — avoids spawningprintf+grepper unique language and keeps shell-significant identifiers (c#,c++) literal.jira-syntaxquick reference: backtick the<name>token in the reference blockquote so Markdown renderers don't strip it as an HTML tag.
Changed
- CI/release: grant the reusable release workflow
id-token: writeandattestations: write(required byactions/attest-build-provenancefor SLSA build-provenance attestations on release archives); drop unusedpull-requests: write. Drop the deprecatedwith: { bump, attest }inputs and theworkflow_dispatchtrigger from.github/workflows/release.yml— both inputs are ignored upstream and the manual trigger did nothing useful since releases ship via signed tag-push only. (#91, #93)
3.13.0 - 2026-04-27
Added
jira-qa-gather.py: Single-call discovery utility for QA reviewers. Returns issue + description + comments + worklog + structured issue links + web/remote links + URLs extracted from prose (MR/PR/pipeline/commit/tag/release/issue) + sibling tickets in one shot. Supports--json,--quiet,--no-siblings,--sibling-window,--max-siblings. Designed for thepeer-qa-reviewskill but useful for any review workflow. Reuses comment data from the initial issue fetch (no second API call); sibling search usesupdated >= -Ndso open tickets are included; project/issue keys quoted in JQL; exception messages sanitized via_sanitize_error. CLI smoke tests added intests/test_cli_smoke.py. Companion referencereferences/qa-gather.md. (#80)jira-search.py --start-at: server-side pagination flag for large result sets.
Fixed
jira-syntax: correct closing-tag detection for{code}and{panel}macros; tighter regex; here-string + occurrence-count rewrite; restore executable bit onvalidate-jira-syntax.sh; remove false-positive suppression from inline-code warning.jira-search: harden pagination output and validation.jira-validate: useLazyJiraClientincheck_connectivity; always show the "ignored--profile" warning when applicable.jira-transition: fix hardcoded comment truncation.- SKILL.md compatibility line: drop
curlfrom the dependency list (no longer required).
3.12.0 - 2026-04-19
Added
jira-watchers.py: List, add, and remove watchers on issues with--dry-runpreviews and idempotent self-watch defaults. SurfacesisWatchingstate in the list header, distinguishes 403 vs 404 error shapes, and pins DC vs Cloud watcher-delete parameter mapping.jira-version.py: Full version CRUD — list (paginated,--query,--order-by, client-side status filter), get (by ID or name with--project, optional--counts), create (dates, flags,--dry-run, 409 duplicate-name surfacing), update via safe-merge helper (GET + merge + PUT), release/unrelease, archive/unarchive, move (--after/--position), merge (--dry-runcounts preview), delete (with reassign flags, orphan warning, dry-run reference counts).evals/run-evals.sh— headless runner for the comprehensive eval suite usingclaude --print --output-format stream-json --plugin-dir. Emits per-eval pass/fail and tool-call counts, plus an optional consolidated--results-json. Documented in rootAGENTS.md.- 5 new eval cases (IDs 14–18) probing reference-load behavior for the refactored skill.
- Reference docs
watchers.mdandversions.mdwith "When to load" headers.
Changed
- Progressive-disclosure refactor of
jira-communication/SKILL.md: extract advanced examples into 8 new feature-class references (issue-editing,creation,comments,worklog,attachments,links,agile,fields-and-users). SKILL.md drops from 491 to 392 words. All 12 references carry standardized "When to load" headers so Claude loads the right one on demand. A 3× baseline + 3× post-refactor eval comparison shows zero pass→fail regressions, and tool-call delta ≤ +1 per eval versus the stricter max_baseline vs min_post rubric (worst case: eval 11 gains one Read call to loadreferences/creation.md). - Scrub Netresearch-specific identifiers (
doreen.wienhold,doreen) from eval prompts;create-issue-with-reporterusespaul.siedleras the reporter and the formeruser-searcheval is reframed asuser-meto exercisejira-user.py me.
3.11.0 - 2026-04-17
Added
jira-link.py list: List all issue links on an issue with IDs, link type, direction, and related issue key/summary/status. Supports--jsonand--quietoutput modes.jira-link.py delete: Remove an issue link by--idor by the combination of--to/--type. Detects ambiguous matches and requires--idto disambiguate. Supports--dry-runpreview.jira-issue.py time-in-status PROJ-123 [--status X]: report cumulative time an issue has spent in each status (or in a single status when--statusis given). Re-entered statuses are summed.--statusaccepts a fuzzy term — "review" resolves to "In Review" on most instances; ambiguous matches list candidates. (#72)jira-board.py list --name PATTERN: server-side partial match on board name, so the Jira API does the filtering. Eliminates pulling thousands of boards to grep client-side on large instances. (#72)references/jql-cookbook.md: translation guide for turning natural-language queries like "open bugs stale for 2 weeks" into safe JQL. CoversstatusCategoryvs.status, "blocked" disambiguation, resolver pointers, and worked examples. Complements the existingjql-quick-reference.md. (#72)
Changed
- SKILL.md: add examples for the new
jira-link list/deletesubcommands and the previously-undocumentedjira-weblink delete. Full CRUD for both scripts is still discoverable via--help; SKILL.md shows the operations most relevant to the new delete workflow within the 500-word cap. jira-issue.py --json getnow returns compact JSON by default — null and empty-list fields are stripped, trimming the typical issue payload from ~50 KB (dominated by nullcustomfield_*entries) to a few KB. Pass--rawto restore the full Jira response. (#72)- SKILL.md: add examples for
jira-issue get --expand changelog,transitions, compact-vs---rawJSON,time-in-status, andjira-board list --name. Reference the newjql-cookbook.md.
3.10.1 - 2026-04-16
Fixed
- Windows: ensure UTF-8 stdout/stderr to prevent
charmapcodec errors that caused duplicate Jira operations (issues, comments, transitions) when Unicode status symbols failed to print after successful API calls (#61) - DRY up Windows UTF-8 stream configuration —
config.pynow reusesoutput._ensure_utf8_streams()instead of duplicating the logic - Fix ruff F541 lint error (f-string without placeholders) in
jira-user.py
3.10.0 - 2026-04-16
Added
jira-attachment.py add: Upload files as Jira issue attachments with--dry-runpreview. Supports--json,--quiet, and default output modes. (#64)jira-create.py --reporter: Set issue reporter at creation time via--reporter/-rflag, reusingresolve_assignee()for user resolution. (#62)jira-user.py search: Search users by partial name, username, or email with--limitoption. Server/DC and Cloud API fallback. (#62)- Evals 11-13 with baseline/iteration proofs for reporter, user search, and attachment upload
Fixed
- CI: renamed
lint.ymltovalidate.ymlper skill-repo convention (#63)
3.9.0 - 2026-04-09
Added
jira-weblink.py: Full CRUD for Jira web links (remote links) —add,list,update,deletesubcommands for managing external URLs on issues. Supports identification by link ID or URL with proper conflict detection. (#60)jira-issue.py get: Now displays issue links (with directional arrows→/←) and web links ([id] title — url) in both text and JSON output. Web links available aswebLinkskey in JSON. (#60)--fields weblinkspseudo-field to explicitly request web link fetching when filtering fields
Fixed
--fieldsparsing now filters empty tokens and preserves field order- Removed duplicate
LICENSEfile (split licensing already covered byLICENSE-MITandLICENSE-CC-BY-SA-4.0) - Corrected
composer.jsonlicense field to(MIT AND CC-BY-SA-4.0) - Added CLAUDE.md symlinks in skill directories for agent discovery
- CI: use reusable harness-verify workflow from skill-repo-skill
3.8.0 - 2026-04-02
Added
jira-worklog-query.py: Cross-cutting worklog query tool with date range, user, project, issue, epic, and sprint filters. Supports summary, detail, JSON, and quiet output modes. Auto-detects Tempo Timesheets plugin for faster server-side filtering with fallback to Jira REST API. (#59)
Fixed
- Use
${CLAUDE_SKILL_DIR}for script paths in SKILL.md for portability (#58)
3.7.0 - 2026-04-02
Added
jira-issue.py delete: Delete issues with--dry-runpreview and--delete-subtaskssupport. Uses library's nativedelete_issue()method. Closes #54. (#56)jira-move.pytype change: Support changing issue type within the same project via--issue-typeflag (e.g.,jira-move issue PROJ-123 PROJ --issue-type Task). Matches Jira's own "Move" semantics. Closes #55. (#57)
Fixed
- Hook output shows absolute
uv runcommands instead of bare script names - Pre-existing ruff lint error in test file (extraneous f-string prefix)
3.6.1 - 2026-03-26
Fixed
- Resolve all open issues: multi-profile auto-resolution, error sanitization, validate script improvements (#47, #48)
- Pin reusable workflow reference to commit SHA (#49)
- Use branch ref for org-internal reusable workflows (#52)
Changed
- Update astral-sh/setup-uv action to v8 (#53)
3.6.0 - 2026-03-22
Added
--assignee mesupport: Sharedresolve_assignee()inlib/client.pyresolves"me"viaclient.myself()on Cloud and Server/DC. Works on any script with--assignee. (#38)- Subtask type auto-detection:
resolve_subtask_type()queries Jira APIsubtaskboolean — no naming convention assumptions.jira-create.pyauto-resolves when--parentgiven. (#39) jira-fields.py types [PROJECT]: List available issue types with subtask flagjira-comment.py delete: Delete comments. Closes #33. (#40)- Skill evals: 14 eval scenarios testing all common Jira operations
Changed
- SKILL.md rewritten for direct execution: Copy-paste recipes for all operations. Agents go from 3-9 tool calls to 1 per task (-52% average)
- Assignee resolution deduplicated: Shared
resolve_assignee()replaces duplicated blocks injira-create.pyandjira-issue.py
3.5.0 - 2026-03-21
Added
jira-move.py: Move issues between projects (#37)
3.4.0 - 2026-03-17
Added
- Agent Skills spec frontmatter and improved descriptions
3.3.5 - 2026-02-27
Fixed
- jira-issue.py: Guard assignee lookup against non-list API response on Server/DC
- jira-create.py: Same assignee lookup fix applied to issue creation
- plugin.json: Align plugin name with SKILL.md
- composer.json: Rename package to match repository name
Documentation
- SKILL.md: Add working directory note clarifying script path context
3.3.4 - 2026-02-25
Added
- Multi-profile support: Work with multiple Jira instances via
~/.jira/profiles.json(#15)- New config format
~/.jira/profiles.jsonwith named profiles and project mappings - Automatic profile resolution: URL host matching, project key mapping, directory context
--profile/-Pflag added to all 14 CLI scriptsjira-setup.py --profile NAME: Create/update named profiles interactivelyjira-setup.py --migrate: Convert existing~/.env.jirato profiles.jsonjira-validate.py --profile NAME: Validate specific profilejira-validate.py --all-profiles: Validate all profiles with status table.jira-profilefile support for per-directory profile selection- Hook script detects and suggests profiles from issue keys and URLs
- Full backwards compatibility:
~/.env.jiracontinues to work as fallback
- New config format
- New library functions in
scripts/lib/config.py:load_profiles(): Load and validate profiles.jsonresolve_profile(): Priority-based profile resolution algorithmprofile_to_config(): Convert profile to env-style config dictload_config(): Unified loader combining profiles and legacy env files
- Comprehensive test suite: 187 tests covering CLI smoke tests, config, client, and security (#15)
Fixed
- SKILL.md: Clean frontmatter and align description with quality standards
3.3.3 - 2026-02-20
Internal maintenance release (CI improvements).
3.3.2 - 2026-02-15
Fixed
- SKILL.md: Align description with writing-skills quality standard
3.3.1 - 2026-02-07
Internal maintenance release (CI improvements).
3.3.0 - 2026-01-30
Added
- allowed-tools field (experimental): Pre-approved tool permissions per Agent Skills spec
- jira-communication:
Bash(uv run scripts/*:*) Read - jira-syntax:
Bash(scripts/validate-jira-syntax.sh:*) Read - See: https://agentskills.io/specification#allowed-tools-field
- jira-communication:
- GitHub Actions release workflow: Automated package building on tag push (#11)
jira-integration-plugin-*.zip- Full plugin for multi-skill platformsjira-communication-skill-*.zip- Standalone skill for Claude Desktopjira-syntax-skill-*.zip- Standalone skill for Claude Desktop
Changed
- README.md: Clarify this is a plugin containing skills, not a standalone skill
- README.md: Add installation options for plugin vs individual skill packages
- README.md: Reference Agent Skills specification for cross-platform compatibility
- Remove root-level SKILL.md (redundant for plugin architecture)
3.2.1 - 2026-01-22
Fixed
- hooks.json: Remove duplicate hooks declaration (#12)
3.2.0 - 2026-01-22
Added
- UserPromptSubmit hook: Auto-detect Jira issue keys in user prompts (#10)
- AGENTS.md: Document release workflow
3.1.6 - 2026-01-14
Fixed
- jira-issue.py: Use
accountIdfor assignee updates on Jira Cloud (#9) - jira-link.py: Use correct API format for
create_issue_link - Documentation: Add working directory note and fix script tables (#8)
3.1.5 - 2026-01-07
Changed
- SKILL.md: Reduce size for context efficiency
3.1.4 - 2026-01-07
Changed
- jira-communication SKILL.md: Reduce size for context efficiency
3.1.3 - 2026-01-06
Added
- Agent Skills branding: Cross-platform compatibility improvements (#6)
Fixed
- plugin.json: Update skills schema to path strings format (breaking schema change)
Changed
- Author metadata: Remove email from author nodes, add URL to plugin.json
- Documentation: Add source repository footer for contributions
3.1.2 - 2025-12-19
Added
- Auto-trigger: Automatic activation on Jira URLs and interactive auth setup
- CAPTCHA detection: Challenge detection for Jira Server/DC authentication
Fixed
- Security: Address security issues identified by CodeQL scan
- skill-creator: Apply skill-creator best practices to SKILL.md files
3.1.1 - 2025-12-15
Fixed
- composer.json: Add Netresearch to description, update email
3.1.0 - 2025-12-12
Added
- Attachment support: Download and list issue attachments via
jira-issue.py - Output improvements: Enhanced table formatting and field display (#4)
Fixed
- jira-transition.py: Use
set_issue_statusfor Jira Server/DC compatibility - jira-comment.py: Restore comment support via
updateparameter - Consistency improvements: Standardized output formatting across scripts
Documentation
- AGENTS.md: Adopt agents.md convention for AI agent instructions
- Root AGENTS.md with global rules and SKILL.md conventions
- Scoped AGENTS.md files for jira-communication and jira-syntax skills
- CLAUDE.md now symlinks to AGENTS.md for backward compatibility
- Branding: Added Netresearch attribution to README.md and SKILL.md
3.0.2 - 2025-11-26
Added
- composer.json: Composer-based skill package distribution via
netresearch/agent-jira-skill - references/jql-quick-reference.md: Validated JQL syntax reference (validated against official docs)
- references/troubleshooting.md: Setup and error guidance for common issues
- Environment variable fallback:
~/.env.jirais now optional whenJIRA_URLand auth env vars are directly set (file takes priority if present)
Fixed
- jira-worklog.py: Auto-normalize
--startedtimestamp format (handles ISO8601 without timezone) - jira-worklog.py: Use correct atlassian-python-api method for adding worklogs
- jira-user.py: Resolve user lookup on Jira Server/DC with multi-fallback approach (direct username, REST API search, Cloud-compatible fallback)
- jira-issue.py: Add missing
--json,--quiet,--fullflags togetsubcommand - jira-issue.py: Fix
--fieldsparameter to pass string instead of list to Jira API - jira-issue.py: Add truncation notice with
--fulloption for complete content retrieval
Improved
- SKILL.md: Enhanced description with explicit 11-point capability list
- Cross-references: Added references to jira-syntax skill for content formatting
- Workflow examples: Added common workflow patterns with prominent flag ordering warning
Documentation
- CLI flag ordering requirement documented in SKILL.md
- Cleaned up outdated documentation files
3.0.1 - 2025-11-25
BREAKING CHANGES
- jira-search.py: Replaced
--outputchoice option with standard--jsonand--quietflags--output table→ default (no flags)--output json→--json--output keys→--quiet
Added
- jira-validate.py: Added
--jsonand--quietoptions for consistent CLI interface - jira-fields.py: Added
--quietoption (outputs field IDs only) - jira-link.py: Added
--quietoption (outputs link type names only)
Fixed
- All 12 scripts now consistently support
--help,--json, and--quietas documented in SKILL.md
3.0.0 - 2025-11-25
BREAKING CHANGES
- Removed MCP server dependency: The
mcp-atlassianDocker-based MCP server is no longer used - New invocation pattern: All operations now use
uv run scripts/...instead of MCP tool calls - Skill renamed:
jira-mcp→jira-communication
Added
- Script-based architecture: Lightweight Python scripts with PEP 723 inline dependencies
- Shared library (
lib/): Common utilities for client initialization, config, and output formatting - Core scripts (
scripts/core/):jira-validate.py- Environment validation with actionable error messagesjira-worklog.py- Time tracking (add, list)jira-issue.py- Issue operations (get, update)jira-search.py- JQL search queries
- Workflow scripts (
scripts/workflow/):jira-create.py- Issue creation with all common fieldsjira-transition.py- Status transitions with commentsjira-comment.py- Comment operationsjira-sprint.py- Sprint operations (list, issues, current)jira-board.py- Board operations (list, issues)
- Utility scripts (
scripts/utility/):jira-fields.py- Field search and listingjira-user.py- User informationjira-link.py- Issue linking
- New features:
--dry-runflag for all write operations--json,--quietoutput format options- Actionable error messages with suggestions
- Auto-detection of Jira Cloud vs Server/DC
Changed
- Dependencies: Now uses
uv/uvxinstead of Docker - Context usage: Reduced from ~8,000-12,000 tokens to ~500 tokens
- Startup time: Reduced from 3-5s (Docker) to <1s
Removed
mcp-atlassianMCP server configuration- Docker dependency
- Confluence operations (separate skill if needed)
- Old
jira-mcpskill (use git history for reference)
Migration
See skills/jira-communication/references/migration-guide.md for detailed migration instructions from v2.x.
2.0.1 - 2025-11-25
Fixed
- SKILL.md Frontmatter: Removed invalid fields (
version,mcp_servers) that are not recognized by Claude Code skill loading - Skill Triggering: Moved "when to use" information from SKILL.md body to
descriptionfield for proper skill activation - plugin.json Structure: Added missing
skillsarray declaration with proper paths to both skills
Improved
- Token Efficiency: Reduced jira-mcp/SKILL.md from ~415 to ~129 lines (69% reduction)
- Token Efficiency: Reduced jira-syntax/SKILL.md from ~243 to ~83 lines (66% reduction)
- Progressive Disclosure: SKILL.md files now serve as lean entry points, directing to comprehensive reference files
- Navigation: Added Table of Contents to
jql-reference.mdandjira-syntax-quick-reference.mdfor easier navigation
Changed
- Description Field: Now includes comprehensive trigger patterns (10 triggers for jira-mcp, 8 for jira-syntax)
- SKILL.md Structure: Follows skill-creator best practices with concise body pointing to references
- Reference Files: Long reference files (>100 lines) now have TOCs for better discoverability
Documentation
- Updated CLAUDE.md to reflect leaner skill architecture
- Skills validated against skill-creator framework best practices
2.0.0 - 2024-11-07
⚠️ BREAKING CHANGES
Major architectural redesign: The unified jira skill has been split into two specialized skills within a single plugin:
- jira-mcp: MCP server communication and Jira API operations
- jira-syntax: Jira wiki markup syntax validation and templates
Migration Required: See MIGRATION.md for upgrade instructions.
Changed
- Plugin name:
jira→jira-integration - Skill structure: Single unified skill → Two specialized skills
- File organization: Templates, references, and scripts reorganized by skill
- Activation patterns: Skills now activate independently based on context
Added
- jira-mcp skill: Dedicated MCP communication and API operations
references/jql-reference.md: Comprehensive JQL syntax guide with examplesreferences/mcp-tools-guide.md: Complete MCP tool documentationreferences/workflow-patterns.md: Common multi-step operation sequences
- jira-syntax skill: Dedicated syntax validation and templates
- Same templates moved from unified skill
- Same syntax reference and validation scripts
- MIGRATION.md: Complete migration guide from v1.x to v2.0.0
- Plugin-level configuration: Both skills declared in single
plugin.json
Improved
- Separation of concerns: API operations vs syntax enforcement
- Offline capability: jira-syntax works without MCP server for validation
- Clearer activation: Skills activate based on specific context
- Better documentation: Dedicated references for each domain
- Easier maintenance: Update skills independently
Removed
- Old unified
skills/jira/directory (archived inarchive/jira-unified/)
1.0.3 - 2024-11-07
Fixed
- Added Docker as explicit prerequisite in README.md to prevent installation errors
- Removed references to non-existent templates (Task Template, Comment Templates) from documentation
- Updated template section to accurately reflect available resources
Added
- CHANGELOG.md following Keep a Changelog format for better version tracking
1.0.2 - 2024-11-07
Fixed
- Moved MCP server configuration inline to avoid collisions when working on this project
- Fixed environment file path for Docker-based MCP server execution
- Corrected
JIRA_ENV_FILEreference to use${HOME}/.env.jirainstead of relative path
Changed
- Updated plugin metadata for better marketplace integration
- Cleaned up CLAUDE.md documentation for clearer skill guidance
1.0.1 - 2024-11-06
Changed
- Updated plugin metadata and documentation
- Improved CLAUDE.md with clearer project architecture guidance
1.0.0 - 2024-11-06
Added
- Initial release of Jira Integration Skill
- Automatic MCP server configuration via bundled
.mcp.json - Docker-based mcp-atlassian server integration
- Comprehensive Jira wiki markup syntax enforcement
- Bug report template with proper Jira formatting
- Feature request template with acceptance criteria structure
- Complete Jira syntax quick reference documentation
- Syntax validation script for Jira wiki markup
- Support for all mcp-atlassian MCP tools:
- Issue CRUD operations (create, read, update, search)
- JQL query support for advanced searching
- Project and sprint management
- Worklog tracking and time logging
- Comment management with proper formatting
- Issue linking (blocks, relates to, duplicates, epic)
- Attachment upload and download
- Issue transitions and workflow management
- Batch operations for bulk updates
- Comprehensive README with installation and usage examples
- Integration with Netresearch Claude Code Marketplace
- MIT License
Documentation
- Complete README.md with installation, usage, and troubleshooting
- SKILL.md activation patterns and workflow guidance
- CLAUDE.md project architecture and development guidelines
- Jira syntax quick reference with examples
- Template documentation for bug reports and feature requests
Release Notes
Version 1.0.2
This release focuses on improving the reliability of MCP server configuration by moving it inline with the skill. This prevents configuration conflicts and ensures the correct environment file path is used for Docker-based execution.
Version 1.0.0
First stable release providing comprehensive Jira integration through Claude Code. The skill enforces proper Jira wiki markup syntax across all operations, includes ready-to-use templates, and provides seamless Docker-based MCP server integration with zero manual configuration required.