@softspark/jira-mcp 1.10.0 → 1.12.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/NOTICE +5 -0
- package/README.md +12 -14
- package/dist/cli.js +57 -56
- package/dist/index.js +54 -54
- package/package.json +5 -22
- package/CHANGELOG.md +0 -311
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@softspark/jira-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.12.0",
|
|
4
4
|
"description": "MCP server for Jira integration — multi-instance routing, ADF formatting, task caching, and comment templates via the Model Context Protocol.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mcp",
|
|
@@ -18,7 +18,8 @@
|
|
|
18
18
|
"homepage": "https://github.com/softspark/jira-mcp",
|
|
19
19
|
"repository": {
|
|
20
20
|
"type": "git",
|
|
21
|
-
"url": "git+https://github.com/softspark/jira-mcp.git"
|
|
21
|
+
"url": "git+https://github.com/softspark/jira-mcp.git",
|
|
22
|
+
"directory": "packages/jira-mcp"
|
|
22
23
|
},
|
|
23
24
|
"bugs": {
|
|
24
25
|
"url": "https://github.com/softspark/jira-mcp/issues"
|
|
@@ -56,30 +57,12 @@
|
|
|
56
57
|
},
|
|
57
58
|
"scripts": {
|
|
58
59
|
"build": "tsup",
|
|
59
|
-
"dev": "tsx src/cli.ts"
|
|
60
|
-
"test": "vitest run",
|
|
61
|
-
"test:watch": "vitest",
|
|
62
|
-
"test:coverage": "vitest run --coverage",
|
|
63
|
-
"lint": "eslint src/ tests/",
|
|
64
|
-
"lint:fix": "eslint src/ tests/ --fix",
|
|
65
|
-
"typecheck": "tsc --noEmit",
|
|
66
|
-
"validate:counts": "python3 scripts/validate_counts.py",
|
|
67
|
-
"prepublishOnly": "npm run build && npm run lint && npm run test"
|
|
60
|
+
"dev": "tsx src/cli.ts"
|
|
68
61
|
},
|
|
69
62
|
"dependencies": {
|
|
70
63
|
"commander": "^14.0.3"
|
|
71
64
|
},
|
|
72
65
|
"devDependencies": {
|
|
73
|
-
"@
|
|
74
|
-
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
75
|
-
"@types/node": "^25.6.0",
|
|
76
|
-
"@vitest/coverage-v8": "^4.1.4",
|
|
77
|
-
"eslint": "^10.2.0",
|
|
78
|
-
"tsup": "^8.0.0",
|
|
79
|
-
"tsx": "^4.0.0",
|
|
80
|
-
"typescript": "^6.0.2",
|
|
81
|
-
"typescript-eslint": "^8.58.2",
|
|
82
|
-
"vitest": "^4.1.4",
|
|
83
|
-
"zod": "^4.3.6"
|
|
66
|
+
"@softspark/atlassian-mcp-core": "*"
|
|
84
67
|
}
|
|
85
68
|
}
|
package/CHANGELOG.md
DELETED
|
@@ -1,311 +0,0 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to `@softspark/jira-mcp` are documented here.
|
|
4
|
-
|
|
5
|
-
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
6
|
-
Versioning follows [Semantic Versioning](https://semver.org/).
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## v1.10.0 -- Remaining Estimate (2026-09-01)
|
|
11
|
-
|
|
12
|
-
### Added
|
|
13
|
-
|
|
14
|
-
- **`remaining_estimate` in `update_task`** -- writes `timetracking.remainingEstimate`.
|
|
15
|
-
Jira keeps the two estimates independent: setting `original_estimate` on a parent
|
|
16
|
-
issue leaves its remaining estimate at the old value, so a report that sums
|
|
17
|
-
remaining still showed the pre-edit total. Setting one field does not disturb
|
|
18
|
-
the other, and both can be sent in a single call. Same format and day rejection
|
|
19
|
-
as `original_estimate`.
|
|
20
|
-
|
|
21
|
-
## v1.9.0 -- Sub-tasks and Estimates (2026-09-01)
|
|
22
|
-
|
|
23
|
-
### Added
|
|
24
|
-
|
|
25
|
-
- **`parent_key` in `create_task`** -- sets the Jira `parent` field so sub-tasks can be
|
|
26
|
-
created at all. `epic_key` resolves the Epic Link custom field, which is a different
|
|
27
|
-
field, so passing it for a sub-task made Jira answer with
|
|
28
|
-
`Issue type is a sub-task but parent issue key or id not specified`.
|
|
29
|
-
- **`original_estimate` in `create_task` and `update_task`** -- writes
|
|
30
|
-
`timetracking.originalEstimate`. Estimates could only be set by hand in the Jira UI
|
|
31
|
-
before; `log_task_time` logs work already done, which is a different field.
|
|
32
|
-
Accepts the same `"2h"` / `"30m"` / `"2h 30m"` format as `log_task_time` and rejects
|
|
33
|
-
days through the same parser.
|
|
34
|
-
|
|
35
|
-
## v1.8.1 -- Duplicate Detection (2026-08-03)
|
|
36
|
-
|
|
37
|
-
### Fixed
|
|
38
|
-
|
|
39
|
-
- **Duplicate detection never matched anything.** `findExistingTask` searched with
|
|
40
|
-
`summary = "..."`, but `summary` is a text field and JQL only supports `~` on it.
|
|
41
|
-
Jira answers `=` with an empty result set instead of an error, so every lookup
|
|
42
|
-
reported "not found": `update_existing` never updated, and re-running a bulk config
|
|
43
|
-
created a second copy of every task. The lookup now uses a quoted `~` phrase and
|
|
44
|
-
compares the returned summary exactly, since `~` is a fuzzy match. Found by running
|
|
45
|
-
a config twice against a live instance and getting a duplicate issue.
|
|
46
|
-
|
|
47
|
-
## v1.8.0 -- Status Paths (2026-08-03)
|
|
48
|
-
|
|
49
|
-
### Added
|
|
50
|
-
|
|
51
|
-
- **`status` accepts an ordered path** in bulk task configs -- `"status": ["On hold", "Open"]`
|
|
52
|
-
walks the transitions one at a time. Jira only exposes the transitions available from an
|
|
53
|
-
issue's *current* status, so a target that is not directly reachable from the initial
|
|
54
|
-
status could not be set at all before. A plain string still means a single transition.
|
|
55
|
-
- **`warnings` in `create_monthly_tasks` output** -- per-task problems that did not stop the
|
|
56
|
-
issue from being written now surface in the tool response instead of being dropped by the
|
|
57
|
-
counters-only summary.
|
|
58
|
-
|
|
59
|
-
### Fixed
|
|
60
|
-
|
|
61
|
-
- **A rejected status transition is no longer silent.** `setStatus` swallowed every failure,
|
|
62
|
-
including the ordinary case of the requested status simply not being reachable: the issue
|
|
63
|
-
was created, the status was ignored, and the run reported `failed: 0`. Eleven monthly admin
|
|
64
|
-
tasks sat in the wrong status for months because of this. The transition is now reported as
|
|
65
|
-
a `warning` on the task result, naming the status that failed and listing the ones that were
|
|
66
|
-
reachable at that point. The issue itself is still created -- the transition stays non-fatal.
|
|
67
|
-
|
|
68
|
-
### Changed
|
|
69
|
-
|
|
70
|
-
- **`TaskResult` gains a `warning` field** (`string | null`). `formatBulkResult` prints it
|
|
71
|
-
indented under the task line. Consumers destructuring `TaskResult` are unaffected; anyone
|
|
72
|
-
constructing one now has to supply the field.
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
### Changed -- licence: MIT to Apache-2.0
|
|
77
|
-
|
|
78
|
-
The project is now licensed under the Apache License 2.0. It stays permissive:
|
|
79
|
-
fork it, modify it, ship it commercially. What changes is what a redistributor
|
|
80
|
-
owes back.
|
|
81
|
-
|
|
82
|
-
- **`NOTICE` is the point.** MIT already required keeping the copyright notice, so
|
|
83
|
-
attribution is not new. Apache-2.0 adds section 4(d): a redistributor must carry
|
|
84
|
-
the contents of `NOTICE` -- project name, copyright, source URL -- into their
|
|
85
|
-
distribution. `NOTICE` is in `package.json` `files`, so it ships with the package.
|
|
86
|
-
- **Modified files must say so** (section 4b), an express patent grant with
|
|
87
|
-
retaliation (section 3), and no rights to the project or company names
|
|
88
|
-
(section 6). None of these existed under MIT.
|
|
89
|
-
- **Attribution reaches the published bundles through a build banner.** This is
|
|
90
|
-
the part specific to this package: npm ships `dist/`, not `src/`, and the build
|
|
91
|
-
runs with `minify: true`, which strips every comment. SPDX headers in `src/`
|
|
92
|
-
are for whoever clones the repository; consumers see the tsup `banner`, now
|
|
93
|
-
present in both `dist/index.js` and `dist/cli.js`.
|
|
94
|
-
- **SPDX headers on 165 source files**, placed after any shebang.
|
|
95
|
-
- **Nothing is revoked.** Releases up to and including v1.6.0 were published under
|
|
96
|
-
MIT and remain available under MIT. All contributions were made by the
|
|
97
|
-
copyright holder, so no third-party permission was required.
|
|
98
|
-
|
|
99
|
-
`LICENSE` holds the verbatim Apache-2.0 text, cross-verified against two
|
|
100
|
-
independent published copies before being written.
|
|
101
|
-
|
|
102
|
-
### Tests
|
|
103
|
-
|
|
104
|
-
- `tests/licensing.test.ts`, 8 assertions run by `npm test`: SPDX headers present
|
|
105
|
-
and naming Apache-2.0, `LICENSE` complete, `NOTICE` carrying attribution and
|
|
106
|
-
section 4(d), both files in `package.json` `files`, `package.json` declaring
|
|
107
|
-
Apache-2.0, and **both build entries carrying the licence banner**. The banner
|
|
108
|
-
assertion exists because losing it would strip attribution from the published
|
|
109
|
-
artifact while every other check stayed green.
|
|
110
|
-
|
|
111
|
-
---
|
|
112
|
-
|
|
113
|
-
## v1.6.0 -- ADF Nested Lists, Task Lists & Doc-Parity Gates (2026-06-10)
|
|
114
|
-
|
|
115
|
-
### Added
|
|
116
|
-
- **Nested list support in ADF conversion** -- indented markdown lists (2 spaces or tab) now produce properly nested `bulletList`/`orderedList` ADF nodes instead of being flattened, in both write and read directions. Read direction renders nesting with 2-space indentation.
|
|
117
|
-
- **Task list (checkbox) support** -- `- [ ]` / `- [x]` markdown converts to ADF `taskList`/`taskItem` nodes (Jira checkboxes) with document-unique `localId`s, and renders back to markdown checkboxes including nesting. Nested bullet/ordered lists under a task item are lifted to siblings after the task list to keep the ADF valid.
|
|
118
|
-
- **Image degradation** -- `` markdown converts to a link (alt text as label, URL as fallback) instead of leaking a stray `!` into the text. ADF media nodes require uploaded attachments, so a link is the lossless-enough fallback.
|
|
119
|
-
- **`date` node rendering on read** -- ADF date nodes now render as `YYYY-MM-DD` instead of disappearing from task descriptions and comments.
|
|
120
|
-
- **Doc-parity checks in `validate_counts.py`** -- the validator now also verifies the README version badge against `package.json`, and that every MCP tool from `definitions.ts` is documented in `kb/reference/api.md` and named in `rules/jira-mcp.md`.
|
|
121
|
-
|
|
122
|
-
### Changed
|
|
123
|
-
- **CI enforces the coverage gate** -- the test job runs `npm run test:coverage`, so the 70% thresholds (lines, branches, functions) actually block merges. Branch coverage raised from 64.5% to above the threshold with new CLI and ADF edge-case tests.
|
|
124
|
-
|
|
125
|
-
### Fixed
|
|
126
|
-
- **README version badge drift** (1.4.3 -> 1.5.0) and stale test counts.
|
|
127
|
-
- **`kb/reference/api.md`** now documents `search_tasks`, `delete_task`, and `delete_comment`, which were missing despite the "complete reference" claim.
|
|
128
|
-
- **`rules/jira-mcp.md` / `AGENTS.md`** tool list extended to all 19 tools (was 17) and the CLI table extended to all 20 commands (was 14).
|
|
129
|
-
- **Dev dependency vulnerabilities** -- `npm audit fix` applied (7 advisories: fast-uri, brace-expansion, hono, ip-address chains). Runtime dependencies were and remain clean.
|
|
130
|
-
|
|
131
|
-
---
|
|
132
|
-
|
|
133
|
-
## v1.5.0 -- Bulk Template Management & Monthly Tasks Tool (2026-05-04)
|
|
134
|
-
|
|
135
|
-
### Added
|
|
136
|
-
- **`template add bulk` CLI command** -- new third template kind alongside `comment` and `task`. Validates the source JSON against `BulkConfigSchema` and installs it under `~/.softspark/jira-mcp/templates/tasks/<KEY>/monthly_admin.json`. `template list/show/remove` also support the `bulk` kind, keyed by project. Prunes the empty project subdirectory on remove.
|
|
137
|
-
- **`create_monthly_tasks` MCP tool** -- exposes the existing `create-monthly` CLI handler over the protocol. Inputs: `{ execute?: boolean, project?: string }`. Returns a structured result with per-project status (success/error), summary counts, and the resolved config path. Lets MCP clients run monthly bulk task creation without dropping to the CLI.
|
|
138
|
-
|
|
139
|
-
## v1.4.3 -- JQL Escape & Cache Recovery (2026-04-18)
|
|
140
|
-
|
|
141
|
-
### Fixed
|
|
142
|
-
- **`sync_tasks` default JQL parse error** -- `escapeJql` was over-escaping JQL operators (`-`, `+`, `&`, `|`, etc.) inside double-quoted string literals. Jira rejected the resulting query with `'\-' jest niedozwoloną sekwencją modyfikacji JQL`. The escape now only handles `\` and `"` (the only sequences valid inside a quoted JQL string), so `sync_tasks` works without an explicit `jql` argument when the username contains a hyphen.
|
|
143
|
-
- **`reassign_task` / `update_task_status` cache miss after Jira mutation** -- both operations now recover from a cache miss by fetching the task from Jira via `connector.getIssue` and upserting it into the local cache. Previously, calling either tool right after `create_task` (cache not populated) or `log_task_time` (cache invalidated) failed with `TASK_NOT_FOUND` even though the Jira mutation succeeded.
|
|
144
|
-
|
|
145
|
-
### Added
|
|
146
|
-
- **`CacheManager.upsertTask(task)`** -- inserts a task or replaces it by key, tolerating a missing cache file. Used by the new mutation-recovery path.
|
|
147
|
-
|
|
148
|
-
## v1.4.2 -- Supply-Chain Hardening (2026-04-18)
|
|
149
|
-
|
|
150
|
-
### Added
|
|
151
|
-
- **npm provenance attestation** -- `publish.yml` now publishes with `--provenance` and `id-token: write`, producing a SLSA v1 attestation on every release. Consumers can verify via `npm audit signatures` or the Provenance badge on npmjs.com.
|
|
152
|
-
- **Supply-chain gates in release SOP** -- `kb/procedures/sop-release.md` adds a pre-tag check for `--provenance` and `id-token: write` in `publish.yml`, plus a post-publish step that asserts `predicateType == https://slsa.dev/provenance/v1`.
|
|
153
|
-
- **Provenance verification in post-release SOP** -- `kb/procedures/sop-post-release-testing.md` adds Phase 5 covering the SLSA attestation check, `npm audit signatures`, and the npmjs.com Provenance badge.
|
|
154
|
-
- **Version-sync step in pre-commit SOP** -- `kb/procedures/sop-pre-commit.md` adds Step 6 verifying `package.json` and `package-lock.json` agree on the `version` field.
|
|
155
|
-
|
|
156
|
-
### Changed
|
|
157
|
-
- **Release workflow permissions** -- `packages: write` and `id-token: write` added to `.github/workflows/publish.yml` for OIDC attestation.
|
|
158
|
-
- **Release commit now stages the lockfile** -- SOP Phase 5 stages `package.json`, `package-lock.json`, `CHANGELOG.md`, and `README.md`. Prevents lockfile drift between tags.
|
|
159
|
-
|
|
160
|
-
### Fixed
|
|
161
|
-
- **`package-lock.json` top-level version drift** -- lockfile root `version` was stuck at `1.0.0` across prior releases. Regenerated via `npm install --package-lock-only` and now matches `package.json` on every release commit.
|
|
162
|
-
|
|
163
|
-
## v1.4.1 -- Template Loading Fix (2026-04-15)
|
|
164
|
-
|
|
165
|
-
### Fixed
|
|
166
|
-
- **File-backed templates missing after install** -- `PACKAGE_ROOT_DIR` used a hardcoded `../..` relative depth that resolved correctly in the source layout but overshot by one level after tsup bundling. Replaced with `findPackageRoot()` that walks up looking for `package.json`. All 8 built-in comment templates now load correctly from global installs.
|
|
167
|
-
|
|
168
|
-
## v1.4.0 -- Delete Tools & Error Hardening (2026-04-15)
|
|
169
|
-
|
|
170
|
-
### Added
|
|
171
|
-
- **`delete_task` tool** -- delete a Jira issue with ownership enforcement (creator only) and explicit user approval guard.
|
|
172
|
-
- **`delete_comment` tool** -- delete a comment with ownership enforcement (author only) and explicit user approval guard.
|
|
173
|
-
- **Markdown table support in ADF** -- `markdownToAdf()` now converts markdown tables to ADF table nodes.
|
|
174
|
-
|
|
175
|
-
### Changed
|
|
176
|
-
- **Narrowed cache cleanup catch blocks** -- `deleteTask()` and `logTime()` now catch only `TaskNotFoundError` and `CacheNotFoundError` instead of swallowing all exceptions. Unexpected I/O or corruption errors propagate.
|
|
177
|
-
|
|
178
|
-
### Fixed
|
|
179
|
-
- **Silent cache errors** -- cache I/O failures during post-delete and post-worklog cleanup were silently ignored, leaving stale entries without any signal.
|
|
180
|
-
|
|
181
|
-
## v1.3.0 -- File-Backed Templates & Approval Hooks (2026-04-15)
|
|
182
|
-
|
|
183
|
-
### Added
|
|
184
|
-
- **File-backed template catalog** -- ship built-in comment and single-task templates as physical markdown files under `templates-system/`.
|
|
185
|
-
- **Template management CLI** -- add `jira-mcp template add/list/show/remove` for global user overrides in `~/.softspark/jira-mcp/templates/`.
|
|
186
|
-
- **Task templates for `create_task`** -- add `list_task_templates` and template-based issue creation with variable rendering.
|
|
187
|
-
- **Comment approval hook manifest** -- ship `hooks/jira-mcp-hooks.json` for ai-toolkit `inject-hook` flows that preview and gate Jira comment writes.
|
|
188
|
-
|
|
189
|
-
### Changed
|
|
190
|
-
- **Template loading model** -- resolve active templates from system files plus global user overrides, with user files winning on `id` collisions.
|
|
191
|
-
- **Configuration init** -- create dedicated template directories for comments, single-task templates, and bulk task configs.
|
|
192
|
-
- **README validation** -- exclude internal tool helpers from MCP tool counts and refresh counts to match the current source tree.
|
|
193
|
-
|
|
194
|
-
### Fixed
|
|
195
|
-
- **Comment write safety** -- require explicit `user_approved=true` before `add_task_comment` and `add_templated_comment` can mutate Jira.
|
|
196
|
-
- **Comment preview flow** -- render templated comment previews before execution so approval can target the exact outgoing markdown.
|
|
197
|
-
|
|
198
|
-
## v1.2.0 -- Per-Instance Credentials & Jira API Migration (2026-04-14)
|
|
199
|
-
|
|
200
|
-
### Added
|
|
201
|
-
- **Per-instance credentials** -- `set-credentials --url` flag allows different API tokens per Jira instance. Auto-migrates legacy Format A to Format B on first use.
|
|
202
|
-
- **Live Jira API smoke tests** -- post-release SOP now includes Phase 4 with 15 steps testing all MCP tools against the KAN sandbox project.
|
|
203
|
-
- **`validate_counts.py` in pre-commit SOP** -- added as Step 5 to catch README count drift before commit.
|
|
204
|
-
|
|
205
|
-
### Changed
|
|
206
|
-
- **Search endpoint migrated** -- `/rest/api/3/search` → `/rest/api/3/search/jql` (Jira Cloud deprecated the old endpoint with HTTP 410).
|
|
207
|
-
- **`set-credentials` CLI** -- read-modify-write instead of overwrite. Preserves existing credentials when adding instance overrides.
|
|
208
|
-
|
|
209
|
-
### Fixed
|
|
210
|
-
- **Jira Cloud 410 on sync/search** -- `sync_tasks` and `search_tasks` failed on instances where Jira had removed the legacy search endpoint.
|
|
211
|
-
|
|
212
|
-
---
|
|
213
|
-
|
|
214
|
-
## v1.1.0 -- Hardening & Market Readiness (2026-04-14)
|
|
215
|
-
|
|
216
|
-
### Added
|
|
217
|
-
- **Boundary test suite** -- 96 new tests covering `server.ts` (25), `cli/index.ts` (27), and `JiraConnector` (44). Total: 509 tests across 51 files.
|
|
218
|
-
- **Retry/backoff for transient failures** -- `JiraConnector` retries 429 and 503 responses up to 3 times with exponential backoff (1s/2s/4s). Respects `Retry-After` header.
|
|
219
|
-
- **Count validation script** -- `scripts/validate_counts.py` verifies README counts match source code. Enforced in CI via `validate-counts` job.
|
|
220
|
-
- **Count validation in CI** -- new `validate-counts` job in `ci.yml` catches README drift before merge.
|
|
221
|
-
- **ADR-0001** -- documented "hardening before refactor" decision with alternatives and guardrails.
|
|
222
|
-
- **Hardening plan** -- full plan with success criteria and pre-mortem in `kb/planning/`.
|
|
223
|
-
|
|
224
|
-
### Changed
|
|
225
|
-
- **server.ts refactored** -- 719 → 324 lines (-55%). Tool definitions extracted to `src/tools/definitions.ts`, argument helpers to `src/tools/args.ts`.
|
|
226
|
-
- **Major dependency upgrades** -- TypeScript 5 → 6, ESLint 9 → 10, zod 3 → 4, vitest 3 → 4, @types/node 22 → 25.
|
|
227
|
-
- **TypeScript 6 migration** -- added `types: ["node"]` and `ignoreDeprecations: "6.0"` to tsconfig.
|
|
228
|
-
- **zod 4 migration** -- `.default({})` replaced with factory function in `BulkOptionsSchema`.
|
|
229
|
-
- **vitest 4 migration** -- arrow function mocks replaced with regular function syntax for constructor compatibility.
|
|
230
|
-
- **Bundle size** -- 325KB → 520KB (due to zod 4, which is significantly larger).
|
|
231
|
-
- **README** -- "Zero runtime dependencies" corrected to "Minimal runtime dependencies". Test counts updated.
|
|
232
|
-
- **CONTRIBUTING.md** -- full CI workflow documented, `validate:counts` noted as maintainer-managed.
|
|
233
|
-
- **Coverage exclusions reduced** -- `server.ts` and `jira-connector.ts` removed from vitest exclusion list.
|
|
234
|
-
|
|
235
|
-
### Security
|
|
236
|
-
- **Cache file permissions** -- all cache writes use `mode: 0o600` (owner-only). Prevents local privilege escalation on shared machines.
|
|
237
|
-
- **CWD config loading warning** -- stderr warning when `config.json` or `credentials.json` loaded from working directory instead of global config.
|
|
238
|
-
- **Error message truncation** -- Jira API error responses truncated to 200 characters to prevent information leakage.
|
|
239
|
-
- **`saveJsonFile` JSDoc** -- `@security` annotation warns against use for sensitive data.
|
|
240
|
-
|
|
241
|
-
### Documentation
|
|
242
|
-
- **Hardcoded counts removed** from secondary docs (CLAUDE.md, kb/, rules/, copilot-instructions). Counts live only in README (single source of truth pattern from ai-toolkit).
|
|
243
|
-
- **KB docs updated** -- caching.md, architecture.md, configuration.md, troubleshooting/common-issues.md reflect security changes.
|
|
244
|
-
- **Release SOP updated** -- Step 4.5 (validate counts) and Step 3.2 (README "What's New" update) added.
|
|
245
|
-
|
|
246
|
-
---
|
|
247
|
-
|
|
248
|
-
## v1.0.0 -- Initial Public Release (2026-04-14)
|
|
249
|
-
|
|
250
|
-
### MCP Tools (15)
|
|
251
|
-
|
|
252
|
-
- **`sync_tasks`** -- sync Jira tasks to local cache with optional JQL filter
|
|
253
|
-
- **`read_cached_tasks`** -- read tasks from local cache without hitting Jira
|
|
254
|
-
- **`update_task_status`** -- change task status via workflow transition
|
|
255
|
-
- **`update_task`** -- update existing issue fields (summary, description, priority, labels) with ADF conversion
|
|
256
|
-
- **`add_task_comment`** -- add markdown comment (auto-converted to ADF)
|
|
257
|
-
- **`reassign_task`** -- reassign or unassign a task by email
|
|
258
|
-
- **`get_task_statuses`** -- get valid workflow transitions for a task
|
|
259
|
-
- **`get_task_details`** -- get full details with description, comments, and project language
|
|
260
|
-
- **`get_project_language`** -- get configured language for a project (for AI assistants)
|
|
261
|
-
- **`log_task_time`** -- log work time in `"2h 30m"` format
|
|
262
|
-
- **`get_task_time_tracking`** -- get time tracking info (estimate, spent, remaining)
|
|
263
|
-
- **`list_comment_templates`** -- list available comment templates by category
|
|
264
|
-
- **`add_templated_comment`** -- add comment using a template with variable interpolation
|
|
265
|
-
- **`create_task`** -- create a new Jira issue with ADF description, assignee, labels, epic link
|
|
266
|
-
- **`search_tasks`** -- search Jira issues with raw JQL (no caching)
|
|
267
|
-
|
|
268
|
-
### CLI Commands (16)
|
|
269
|
-
|
|
270
|
-
- **`jira-mcp`** / **`jira-mcp serve`** -- start MCP server (stdio transport)
|
|
271
|
-
- **`jira-mcp config init`** -- initialize global config at `~/.softspark/jira-mcp/`
|
|
272
|
-
- **`jira-mcp config add-project <key> <url>`** -- add a Jira project mapping
|
|
273
|
-
- **`jira-mcp config remove-project <key>`** -- remove a project
|
|
274
|
-
- **`jira-mcp config list-projects`** -- show configured projects with language column
|
|
275
|
-
- **`jira-mcp config set-credentials`** -- set API credentials
|
|
276
|
-
- **`jira-mcp config set-default <key>`** -- set default project
|
|
277
|
-
- **`jira-mcp config set-language <lang>`** -- set global default language
|
|
278
|
-
- **`jira-mcp config set-project-language <key> <lang>`** -- set language for a specific project
|
|
279
|
-
- **`jira-mcp create <path>`** -- create tasks from bulk config file (dry-run by default)
|
|
280
|
-
- **`jira-mcp create-monthly`** -- run monthly admin task templates
|
|
281
|
-
- **`jira-mcp cache sync-workflows`** -- sync workflow status transitions
|
|
282
|
-
- **`jira-mcp cache sync-users`** -- sync user list for reassignment
|
|
283
|
-
- **`jira-mcp cache list-workflows`** -- show cached workflows
|
|
284
|
-
- **`jira-mcp cache list-users`** -- show cached users
|
|
285
|
-
|
|
286
|
-
### Features
|
|
287
|
-
|
|
288
|
-
- **Multi-instance routing** -- single server manages multiple Jira Cloud/Server instances. Project key determines routing. Connectors deduplicated by URL via InstancePool.
|
|
289
|
-
- **Language configuration** -- global `default_language` with per-project override. Supports: pl, en, de, es, fr, pt, it, nl. AI assistants check language before writing content.
|
|
290
|
-
- **ADF round-trip** -- bidirectional Markdown ↔ Atlassian Document Format conversion. Zero-dependency built-in parsers (~330 lines each). Literal `\n` normalization for MCP tool parameters.
|
|
291
|
-
- **Local caching** -- tasks synced to `~/.softspark/jira-mcp/cache/` with atomic writes. Workflow and user caches for offline status validation and assignee resolution.
|
|
292
|
-
- **Comment templates** -- 8 built-in templates with `{{variable}}` interpolation and `{{#var}}...{{/var}}` conditional blocks.
|
|
293
|
-
- **Bulk task creation** -- JSON config templates with dry-run default, rate limiting, epic link discovery, bilingual support (8 languages), idempotent updates.
|
|
294
|
-
- **Per-instance credentials** -- Format A (single credential) and Format B (per-URL credentials with default fallback). Backward compatible.
|
|
295
|
-
- **Supply chain protection** -- `ignore-scripts=true`, no axios, no dynamic requires. Self-contained 325KB bundle, 1 runtime dep (commander).
|
|
296
|
-
- **Strict TypeScript** -- `strict: true`, no `any`, `readonly` interfaces, Zod validation at all boundaries. 413 tests across 47 test files.
|
|
297
|
-
- **Typed error hierarchy** -- 15 error classes with machine-readable codes. Structured `{ success, error, code }` responses.
|
|
298
|
-
|
|
299
|
-
### Architecture
|
|
300
|
-
|
|
301
|
-
Four layers -- each depends only on layers below:
|
|
302
|
-
|
|
303
|
-
1. **Types & Config** (`config/`, `errors/`, `*/types.ts`) -- pure data, zero runtime deps
|
|
304
|
-
2. **Infrastructure** (`connector/`, `cache/`, `adf/`, `templates/`) -- I/O and external APIs
|
|
305
|
-
3. **Business Logic** (`operations/`, `bulk/`) -- orchestrates infrastructure
|
|
306
|
-
4. **Entry Points** (`tools/`, `cli/`, `server.ts`) -- thin dispatchers
|
|
307
|
-
|
|
308
|
-
### AI Toolkit Integration
|
|
309
|
-
|
|
310
|
-
- **Rules file** (`rules/jira-mcp.md`) -- register with `ai-toolkit add-rule` for automatic language checks, sync-first workflow, and tool reference injection.
|
|
311
|
-
- **GitHub Copilot** (`.github/copilot-instructions.md`) -- full project context for Copilot-assisted development.
|