@softspark/jira-mcp 1.8.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,32 @@ Versioning follows [Semantic Versioning](https://semver.org/).
7
7
 
8
8
  ---
9
9
 
10
+ ## v1.9.0 -- Sub-tasks and Estimates (2026-09-01)
11
+
12
+ ### Added
13
+
14
+ - **`parent_key` in `create_task`** -- sets the Jira `parent` field so sub-tasks can be
15
+ created at all. `epic_key` resolves the Epic Link custom field, which is a different
16
+ field, so passing it for a sub-task made Jira answer with
17
+ `Issue type is a sub-task but parent issue key or id not specified`.
18
+ - **`original_estimate` in `create_task` and `update_task`** -- writes
19
+ `timetracking.originalEstimate`. Estimates could only be set by hand in the Jira UI
20
+ before; `log_task_time` logs work already done, which is a different field.
21
+ Accepts the same `"2h"` / `"30m"` / `"2h 30m"` format as `log_task_time` and rejects
22
+ days through the same parser.
23
+
24
+ ## v1.8.1 -- Duplicate Detection (2026-08-03)
25
+
26
+ ### Fixed
27
+
28
+ - **Duplicate detection never matched anything.** `findExistingTask` searched with
29
+ `summary = "..."`, but `summary` is a text field and JQL only supports `~` on it.
30
+ Jira answers `=` with an empty result set instead of an error, so every lookup
31
+ reported "not found": `update_existing` never updated, and re-running a bulk config
32
+ created a second copy of every task. The lookup now uses a quoted `~` phrase and
33
+ compares the returned summary exactly, since `~` is a fuzzy match. Found by running
34
+ a config twice against a live instance and getting a duplicate issue.
35
+
10
36
  ## v1.8.0 -- Status Paths (2026-08-03)
11
37
 
12
38
  ### Added
package/README.md CHANGED
@@ -4,16 +4,16 @@
4
4
 
5
5
  [![CI](https://github.com/softspark/jira-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/softspark/jira-mcp/actions/workflows/ci.yml)
6
6
  [![npm](https://img.shields.io/npm/v/@softspark/jira-mcp)](https://www.npmjs.com/package/@softspark/jira-mcp)
7
- [![version](https://img.shields.io/badge/version-1.8.0-blue)](CHANGELOG.md)
7
+ [![version](https://img.shields.io/badge/version-1.9.0-blue)](CHANGELOG.md)
8
8
  [![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE)
9
9
 
10
10
  ---
11
11
 
12
- ## What's New in v1.8.0
12
+ ## What's New in v1.9.0
13
13
 
14
- - **`status` takes a path, not just a name.** `"status": ["On hold", "Open"]` walks the transitions in order. Jira only ever exposes the transitions out of an issue's *current* status, so a target that is not directly reachable from the initial status was previously impossible to set -- which is exactly how workflows that gate `Open` behind a `Reopen` transition behave.
15
- - **Failed transitions stop being silent.** The old code caught every transition error and moved on: issue created, status ignored, run reports `failed: 0`. It now returns a `warning` naming the status that failed and listing what was reachable instead, surfaced per task and aggregated into `create_monthly_tasks` output.
16
- - **`TaskResult.warning`** -- new `string | null` field for problems that occur after the issue is already written. `formatBulkResult` prints it under the task line.
14
+ - **Sub-tasks can be created.** `create_task` takes `parent_key`, which sets the Jira `parent` field. `epic_key` writes the Epic Link custom field instead, so a sub-task sent with it came back as `Issue type is a sub-task but parent issue key or id not specified`.
15
+ - **Original estimate is settable.** `create_task` and `update_task` take `original_estimate` and write `timetracking.originalEstimate`. Estimates previously had to be typed into the Jira UI by hand -- `log_task_time` records work already done, which is a separate field.
16
+ - **One time format everywhere.** `original_estimate` goes through the same parser as `log_task_time`: `"2h"`, `"30m"`, `"2h 30m"`, and days are rejected.
17
17
 
18
18
  See [CHANGELOG.md](CHANGELOG.md) for full details.
19
19
 
@@ -97,7 +97,7 @@ All configuration lives in `~/.softspark/jira-mcp/` (created by `jira-mcp config
97
97
  | `sync_tasks` | Sync tasks from Jira to local cache | `project_key?`, `jql?` |
98
98
  | `read_cached_tasks` | Read tasks from cache without hitting Jira | `task_key?` |
99
99
  | `update_task_status` | Change task status via workflow transition | `task_key`, `status` |
100
- | `update_task` | Update existing issue fields (markdown → ADF) | `task_key`, `summary?`, `description?`, `priority?`, `labels?` |
100
+ | `update_task` | Update existing issue fields (markdown → ADF) | `task_key`, `summary?`, `description?`, `priority?`, `labels?`, `original_estimate?` |
101
101
  | `add_task_comment` | Add a markdown comment (auto-converted to ADF) | `task_key`, `comment`, `user_approved` |
102
102
  | `delete_task` | Delete a task, only when the authenticated user is the task creator | `task_key`, `user_approved` |
103
103
  | `delete_comment` | Delete a comment, only when the authenticated user is the comment author | `task_key`, `comment_id`, `user_approved` |
@@ -110,7 +110,7 @@ All configuration lives in `~/.softspark/jira-mcp/` (created by `jira-mcp config
110
110
  | `list_comment_templates` | List available comment templates | `category?` |
111
111
  | `list_task_templates` | List available task templates for `create_task` | — |
112
112
  | `add_templated_comment` | Add comment using a template or raw markdown | `task_key`, `template_id?`, `variables?`, `markdown?`, `user_approved` |
113
- | `create_task` | Create a new Jira issue with explicit fields or a task template | `project_key`, `summary?`, `template_id?`, `variables?`, `description?`, `assignee_email?`, `labels?`, `epic_key?` |
113
+ | `create_task` | Create a new Jira issue with explicit fields or a task template | `project_key`, `summary?`, `template_id?`, `variables?`, `description?`, `assignee_email?`, `labels?`, `epic_key?`, `parent_key?`, `original_estimate?` |
114
114
  | `search_tasks` | Search Jira issues with JQL (no caching) | `jql`, `max_results?`, `project_key?` |
115
115
 
116
116
  ## Comment Templates