Help us improve
Share bugs, ideas, or general feedback.
From issuekit
Auto-detects Azure DevOps or Jira MCP and routes issue read/write verbs (getIssue, addComment, etc.) through a vendor adapter with a diff-and-confirm gate.
npx claudepluginhub incubyte/ai-pluginsHow this skill is triggered — by the user, by Claude, or both
Slash command
/issuekit:tracker-adapterThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
A verb dispatcher that lets `incident-postmortem` and `issue-triage` work against any supported issue tracker without naming a specific MCP tool in their agent prompts.
adapters/azure-devops/body-format.mdadapters/azure-devops/mentions.mdadapters/azure-devops/search.mdadapters/azure-devops/states.mdadapters/azure-devops/tools.mdadapters/azure-devops/writes.mdadapters/jira/body-format.mdadapters/jira/mentions.mdadapters/jira/search.mdadapters/jira/states.mdadapters/jira/tools.mdadapters/jira/writes.mdreferences/body-format.mdreferences/detection.mdreferences/diff-and-confirm.mdreferences/policy-schema.mdreferences/verbs.mdInvestigates Bugs and Incidents on Azure DevOps or Jira by searching chats (Slack/Teams), docs (Confluence), Datadog, and the codebase, then produces an evidence-tagged investigation report.
Interacts with Jira issues via CLI scripts — search, create, update, transition, comment, log work, manage sprints, boards, attachments, users, and fields. Auto-triggers on Jira URLs and issue keys.
Triages issues in project trackers using state machine with bug/enhancement categories and states like needs-triage, needs-info. Reproduces bugs, generates agent briefs, applies labels, closes issues.
Share bugs, ideas, or general feedback.
A verb dispatcher that lets incident-postmortem and issue-triage work against any supported issue tracker without naming a specific MCP tool in their agent prompts.
Before serving any verb call, the caller must run the bootstrap sequence below and cache the results for the rest of the session.
Detect the available MCPs. Read references/detection.md and scan the available tool names for each pattern. Set:
tracker ∈ {azure-devops, jira, none}chat ∈ {slack, teams, none}doc ∈ {confluence, azure-wiki, none}log ∈ {datadog, none}Resolve multi-tracker ambiguity. If two trackers are detected, inspect the issue URL or key the caller passed in:
dev.azure.com or visualstudio.com → azure-devops[A-Z][A-Z0-9_]+-\d+ (e.g. PROJ-123) → jiraAskUserQuestion, cache for the session only (do not persist).Bootstrap identity. Call whoAmI() (see references/verbs.md). The adapter implementations are in adapters/<tracker>/. Cache {trackerUser, defaultProject, defaultTeam} and the chat user (if a chat backend was detected).
Load policy. Read .claude/tracker-policy.json if it exists. Merge with shipped defaults from references/policy-schema.md. Track which keys are unset; do not lazy-prompt yet.
Legacy config migration warning. If any of the legacy paths exists, read forward once and print a one-time warning:
.claude/azure-incident-postmortem.config.json.claude/azure-issue-triage.config.json.claude/jira-issue-triage.config.json.claude/jira-bug-triage.config.jsonWarning: "Found legacy config at <path>. Read for this session. To stop this warning, translate the values into .claude/tracker-policy.json and delete the legacy file. Lazy prompts will offer to persist any missing keys."
If tracker == none, stop and tell the caller. The caller cannot proceed without a tracker MCP.
Announce the detection result at the start of the session:
tracker=<tracker> chat=<chat> doc=<doc> log=<log>
The caller invokes verbs by name; this skill routes the call to the resolved adapter.
references/verbs.md. Each verb declares input, output, and which adapter file implements it.adapters/<tracker>/{tools, search, writes, body-format, states, mentions}.md. The adapter file names map 1:1 to the verb categories.references/body-format.md and the per-adapter body-format.md before any write call.When a verb needs a policy value (state name, severity scheme, escalation contact, skip-labels, triaged-label, output_directory, archetype_assignment_after_triage) and the value is unset:
references/policy-schema.md for that key.AskUserQuestion with the question and the documented option set..claude/tracker-policy.json. If the user accepts, write the file with two-space indent and sorted top-level keys. If they decline, keep the answer in session memory only.Never ask the same policy question twice in a session.
Every batch of writes must pass through the gate before any write verb fires. Read references/diff-and-confirm.md for the exact format.
The gate is always on. There is no --dry-run flag — declining at the gate is the dry run.
{verb, target, before, after} tuples.AskUserQuestion once.The gate is a hard boundary. Writes cannot bypass it, even for "small" updates like a label append.
See references/verbs.md for the full schemas. Quick reference:
Reads: getIssue, getIssueHistory, getIssueComments, searchIssues, getIssueTypeSchema, linkedPullRequests, getCurrentSprint, whoAmI, resolveUser, mention.
Writes: assign, transition, updateFields, addComment, addLabel, removeLabel, linkIssue, linkPullRequest.
| Adapter file | Contains |
|---|---|
adapters/<tracker>/tools.md | MCP tool-name allowlist and known prefix variants for that tracker. |
adapters/<tracker>/search.md | Query-language builder (WIQL for AzDO, JQL for Jira). |
adapters/<tracker>/writes.md | Payload shapes for write verbs (JSON Patch for AzDO, edit/transition for Jira). |
adapters/<tracker>/body-format.md | Markdown subset rules and conversion notes for that tracker. |
adapters/<tracker>/states.md | State-graph quirks and the abstract-state → vendor-state mapping rules. |
adapters/<tracker>/mentions.md | How @[userRef] projects to the vendor's mention syntax. |
System.Title or fields.summary as a literal — the verb dispatcher owns the projection.verbs.md, surface it back to the caller; do not improvise.