feat(jira): watch_issues reports what changed on a set of tickets (1.4.0)
Given up to 50 keys and an instant, returns the issues updated since with their status, new comments (author id, plain-text body, own comments flagged) and status transitions, plus the instance's own account. JQL dates are converted to the account's time zone; malformed keys are never queried; a deleted key falls back to per-key reads instead of failing the batch. get_comments gains order, start_at and author_id, and decodes HTML entities. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
id: jira
|
||||
name: Jira
|
||||
version: 1.3.0
|
||||
description: "Atlassian Jira (REST API, Cloud and On-Prem/Data Center) — issue lifecycle (create/read/edit/delete, transitions, assign), comments, web + issue links, attachments (upload/download/delete), field and user lookups, agile boards/sprints/epics, plus issue ingestion (get_incidents) with an OCSF mapper. Basic (email + API token) or Personal Access Token authentication. Stdlib-only, no extra Python dependencies."
|
||||
changelog: "1.3.0 — create_issue and edit_issue offer the Jira site's own values: the project, the issue type of that project and the priority are picked from a list the playbook editor loads from the instance, as is link_issues' link type. Three read commands feed them — list_projects, list_issue_types and list_priorities — and each field keeps accepting a typed value or an expression. 1.2.0 — Declare the risk tier on the 11 commands that carried none: 8 safe_write, 3 destructive. An unset risk is read as destructive by the agent approval gate, so the 8 that only annotate sat behind the same prompt as the ones that change the estate. | 1.1.0 — New command list_filters: the saved filters a Jira instance already holds, with their id, JQL and owner, plus the exact clause to paste into a fetch. A saved filter could always be ingested — filter = 12345 is ordinary JQL — but nothing told you the id, so the workflow was invisible. get_incidents and query_issues now mention it in their help. 1.0.2 — Command field help rewritten: every input now says what to type, in what format, and which command finds the value, instead of restating the field name. get_incidents explains that the fetch adds its own created >= watermark clause and ORDER BY, that the watermark is filled by the alert rule, and that a run does not page. Assignee, board, sprint, comment and attachment fields name the command that returns their id. 1.0.1 — A personal access token silently outranked Basic credentials, so an unusable value left in pat turned every call into an opaque 401. Basic authentication now wins whenever username and api_key are both set, pat serves the rest, and a 401/403 names the method it used and whether the other was configured and ignored. Three configurations that cannot work are refused with the reason instead of being sent to Jira: no usable credential, the Cloud gateway URL without a cloud_id, and a cloud_id set against any other host. HTML error pages are condensed to their message rather than dumped whole, and a non-JSON body reports what answered and where. 1.0.0 — Initial release: JQL ingestion + query, full issue CRUD and transitions, comments, links, attachments, fields/users, and agile board/sprint/epic listing. Cloud (API v3, ADF bodies) and On-Prem (API v2) supported."
|
||||
version: 1.4.0
|
||||
description: "Atlassian Jira (REST API, Cloud and On-Prem/Data Center) — issue lifecycle (create/read/edit/delete, transitions, assign), comments, web + issue links, attachments (upload/download/delete), field and user lookups, agile boards/sprints/epics, plus issue ingestion (get_incidents), a change watch over a set of tickets (watch_issues) with an OCSF mapper. Basic (email + API token) or Personal Access Token authentication. Stdlib-only, no extra Python dependencies."
|
||||
changelog: "1.4.0 — New command watch_issues: given up to 50 issue keys and an instant, it returns the ones changed since, each with its current status, the comments added since (author id and name, plain-text body) and the status transitions from its changelog, plus the identity of the account the instance runs as, so a caller can tell its own comments from the customer's. It is what lets Riposte follow the ticket a case opened. JQL reads a date in the account's time zone and to the minute: the instant is converted to that zone and moved a minute back, and the exact cut is made on the timestamps Jira returns. Keys go into the JQL only when they look like keys (PROJECT-123); anything else is reported, not queried. A key that no longer exists fails a JQL query outright, so the keys are then read one by one and the dead ones reported under missing. get_comments takes order (oldest, the default and the previous behaviour, or newest) and start_at, returns total and next_start_at to page, and adds author_id (accountId on Cloud, key or name On-Prem). It read only the first page, oldest first, so past 50 comments the newest were never returned. Its body text keeps line breaks and decodes HTML entities: an & came out as &. | 1.3.0 — create_issue and edit_issue offer the Jira site's own values: the project, the issue type of that project and the priority are picked from a list the playbook editor loads from the instance, as is link_issues' link type. Three read commands feed them — list_projects, list_issue_types and list_priorities — and each field keeps accepting a typed value or an expression. 1.2.0 — Declare the risk tier on the 11 commands that carried none: 8 safe_write, 3 destructive. An unset risk is read as destructive by the agent approval gate, so the 8 that only annotate sat behind the same prompt as the ones that change the estate. | 1.1.0 — New command list_filters: the saved filters a Jira instance already holds, with their id, JQL and owner, plus the exact clause to paste into a fetch. A saved filter could always be ingested — filter = 12345 is ordinary JQL — but nothing told you the id, so the workflow was invisible. get_incidents and query_issues now mention it in their help. 1.0.2 — Command field help rewritten: every input now says what to type, in what format, and which command finds the value, instead of restating the field name. get_incidents explains that the fetch adds its own created >= watermark clause and ORDER BY, that the watermark is filled by the alert rule, and that a run does not page. Assignee, board, sprint, comment and attachment fields name the command that returns their id. 1.0.1 — A personal access token silently outranked Basic credentials, so an unusable value left in pat turned every call into an opaque 401. Basic authentication now wins whenever username and api_key are both set, pat serves the rest, and a 401/403 names the method it used and whether the other was configured and ignored. Three configurations that cannot work are refused with the reason instead of being sent to Jira: no usable credential, the Cloud gateway URL without a cloud_id, and a cloud_id set against any other host. HTML error pages are condensed to their message rather than dumped whole, and a non-JSON body reports what answered and where. 1.0.0 — Initial release: JQL ingestion + query, full issue CRUD and transitions, comments, links, attachments, fields/users, and agile board/sprint/epic listing. Cloud (API v3, ADF bodies) and On-Prem (API v2) supported."
|
||||
category: ticketing
|
||||
|
||||
# Per-instance configuration. For Jira Cloud set cloud_id (found at
|
||||
@@ -73,6 +73,16 @@ commands:
|
||||
offset: { type: number, description: "Index of the first row, for paging: 0, then 50, then 100…" }
|
||||
required: []
|
||||
outputs_schema: { properties: {} }
|
||||
- id: watch_issues
|
||||
name: jira-watch-issues
|
||||
description: "Report what changed on a set of issues since an instant: for each issue updated since, its status, the comments added since and its status transitions. Also returns self, the account the instance runs as, and flags its own comments. Built for Riposte's ITSM watch, which follows the ticket recorded on a case."
|
||||
risk: read
|
||||
inputs_schema:
|
||||
properties:
|
||||
keys: { type: array, description: "Issue keys to watch, at most 50, e.g. [SOC-1423, SOC-1430]. A comma-separated string is read too. A value that is not a key (PROJECT-123) is not queried and comes back under invalid_keys." }
|
||||
since: { type: string, description: "Only changes at or after this instant: ISO8601 like 2026-10-13T12:30:00Z, or an epoch in seconds or milliseconds. Empty means a first look: every issue, with its latest page of comments, to record as already seen." }
|
||||
required: [keys]
|
||||
outputs_schema: { properties: {} }
|
||||
- id: get_issue
|
||||
name: jira-get-issue
|
||||
description: "Retrieve a single issue by ID or key (flattened)."
|
||||
@@ -193,7 +203,9 @@ commands:
|
||||
properties:
|
||||
issue_id: { type: string, description: "Numeric issue ID, e.g. 10042 — the id field the fetch returns. Give this or issue_key." }
|
||||
issue_key: { type: string, description: "Issue key as shown in Jira, e.g. SOC-1423. Give this or issue_id." }
|
||||
limit: { type: number, description: "Comments to return, newest last, default 50." }
|
||||
limit: { type: number, description: "Comments per page, default 50." }
|
||||
order: { type: string, enum: [oldest, newest], description: "oldest (default) returns the first comments first; newest returns the latest first, which is what you want on a long thread." }
|
||||
start_at: { type: number, description: "Index of the first comment, for paging: 0, then the next_start_at the previous call returned. Empty for the first page." }
|
||||
required: []
|
||||
outputs_schema: { properties: {} }
|
||||
- id: edit_comment
|
||||
|
||||
Reference in New Issue
Block a user