Jira logo

Jira

Community
kv0906
jira

Jira integration via acli CLI. Use when user says '/jira', 'check Jira board', 'create Jira ticket', 'move ticket to done', 'search Jira', 'sync blockers from Jira', 'what's in the sprint', 'Jira status', 'assign ticket', 'view backlog', or wants to interact with Jira issues, sprints, or boards from the terminal.

Overview

Publisherkv0906
Repositorypm-kit
Skill namejira
Stars
140
Forks
35
Bundled files
2
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 2 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by kv0906 on GitHub. Read the source before you install it.

Installation

Install the Jira AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/kv0906/pm-kit/tree/main/.claude/skills/jira
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/kv0906/pm-kit.git /tmp/pm-kit
mkdir -p .claude/skills
cp -r /tmp/pm-kit/.claude/skills/jira .claude/skills/jira
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Jira in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Jira on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Jira is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

/jira — Jira Integration

Bridge your PM-Kit vault with Jira issue tracking via the acli (Atlassian CLI) command-line tool. View boards, create/edit/transition issues, search via JQL, and sync Jira state with vault notes.

Prerequisites

Context

Today's date: !date +%Y-%m-%d Config: @_core/config.yaml Processing rules: @_core/PROCESSING.md Active projects: !ls 01-index/*.md 2>/dev/null | sed 's|01-index/||;s|\.md||'

Input

User input: $ARGUMENTS

Sub-commands

Parse the first word of $ARGUMENTS to determine the sub-command:

Input starts withSub-commandPurposeRead/Write
setupSetupGuide installation + auth configurationConfig write
boardBoardShow board columns with issue countsRead-only
createCreateCreate a Jira issueJira write + optional vault note
statusStatusShow details for a specific issueRead-only
moveMoveTransition an issue to a new statusJira write + vault note update
editEditUpdate issue fieldsJira write
assignAssignAssign an issue to someoneJira write
backlogBacklogShow backlog itemsRead-only
searchSearchFind issues via JQL or natural languageRead-only
sprintSprintShow active sprint detailsRead-only
syncSyncPull Jira state into vault notesVault write (additive only)
(empty)HelpShow help + quick status summaryRead-only

Step 0: Connection Check

Before any sub-command (except setup), verify acli is installed and authenticated:

bash
# 1. Check acli is installed
command -v acli &>/dev/null

# 2. Check auth works with a simple query
acli jira --action getServerInfo 2>/dev/null

If either fails:

Jira CLI (acli) is not connected yet.

Run `/jira setup` to install and configure — it takes about 2 minutes.

Then stop. Don't attempt other operations without a working connection.

Project Resolution

Many sub-commands accept an optional [PROJECT] argument. Resolve it:

  1. If user provides a Jira project key directly (e.g., TEAM), use it
  2. If user provides a vault project ID (e.g., project-a), look up integrations.jira.project_mapping in _core/config.yaml
  3. If no project specified, check for a single active project or use integrations.jira.default_board
  4. If ambiguous, ask the user

setup — Install & Configure

Guide the user through installing acli and connecting to their Jira instance.

Steps to present:

## Jira CLI Setup

### Step 1: Install acli
  brew install acli

Or download from: https://bobswift.atlassian.net/wiki/spaces/ACLI

### Step 2: Authenticate
  acli jira --server https://YOUR-ORG.atlassian.net --user your@email.com --token YOUR_API_TOKEN --action getServerInfo

Generate an API token at: https://id.atlassian.com/manage-profile/security/api-tokens

### Step 3: Save credentials
Create ~/.acli/credentials with:

  jira.server = https://YOUR-ORG.atlassian.net
  jira.user = your@email.com
  jira.token = YOUR_API_TOKEN

### Step 4: Verify
  /jira

You should see your Jira instance info and recent activity.

After presenting, ask the user for their Jira site URL and email to help configure.

Then update _core/config.yaml integrations block:

yaml
integrations:
  jira:
    enabled: true
    site: "your-org.atlassian.net"
    email: "your@email.com"
    project_mapping:
      project-a: TEAM        # vault project ID: JIRA PROJECT KEY
    default_board: ""
    status_mapping:
      "To Do": wip
      "In Progress": wip
      "Done": shipped
      "Blocked": blocked

Confirm each value with the user before writing.


board — View Board

Show the current board state with issues grouped by column.

Processing

  1. Resolve project (see Project Resolution above)
  2. Fetch board data:
bash
acli jira --action getIssueList --project "PROJECT" --outputType json
  1. Group issues by status and present:
## Jira Board — {PROJECT}

### To Do ({count})
- [{KEY}] {summary} — {assignee} ({priority})

### In Progress ({count})
- [{KEY}] {summary} — {assignee} ({priority})

### Done ({count} recent)
- [{KEY}] {summary} — completed {date}
  1. Highlight any issues matching vault blockers (cross-reference by jira_key in frontmatter)

create — Create Issue

Create a Jira issue, optionally from vault note context.

Processing

  1. Determine source — Check if user provided:

    • A vault file path or wikilink → Read that note for context
    • --type, --summary, --description flags → Use directly
    • Freeform text → Parse into fields
    • Nothing → Ask what to create
  2. Extract issue fields:

    • Project: From vault project mapping or ask
    • Type: Task (default), Bug, Story, Epic — from --type or inferred from note type (blocker→Bug)
    • Summary: From --summary, note H1, or frontmatter title
    • Description: From note body or --description (convert wikilinks to plain text)
    • Priority: Map from blocker severity (high→Highest, medium→High, low→Medium) or ask
    • Assignee: From --assignee or ask (optional)
  3. Confirm with user before creating:

Creating Jira issue:
  Project: {PROJECT}
  Type: {type}
  Summary: {summary}
  Priority: {priority}
  Assignee: {assignee}

Proceed? (y/n)
  1. Create the issue:
bash
acli jira --action createIssue --project "PROJECT" --type "Task" --summary "summary" --description "description" --priority "Medium"
  1. Link back — If created from a vault note, update the note:

    • Add jira_key: KEY-123 to frontmatter
    • Add to ## Links > ### Related:
    markdown
    - [KEY-123](https://site.atlassian.net/browse/KEY-123) — Jira issue
  2. Report the created issue key and URL.


status — Issue Details

Show detailed information for a specific issue.

Processing

  1. Parse issue key from $ARGUMENTS (e.g., TEAM-42)
  2. Fetch issue details:
bash
acli jira --action getIssue --issue "KEY-123" --outputType json
  1. Present formatted output:
## TEAM-42: {summary}

**Status**: {status} | **Priority**: {priority} | **Type**: {type}
**Assignee**: {assignee} | **Reporter**: {reporter}
**Sprint**: {sprint} | **Created**: {date}

### Description
{description}

### Comments ({count})
- {author} ({date}): {comment snippet}...

### Vault Links
- [[blockers/project-a/2026-03-01-api-rate-limit|API Rate Limit]] (jira_key: TEAM-42)
  1. Check vault for any notes with jira_key: KEY-123 in frontmatter and show cross-references.

move — Transition Issue

Move an issue to a new status (e.g., "In Progress" → "Done").

Processing

  1. Parse issue key and target status from $ARGUMENTS
    • e.g., /jira move TEAM-42 "Done" or /jira move TEAM-42 done
  2. Fetch available transitions:
bash
acli jira --action getTransitionList --issue "KEY-123"
  1. Match target status (case-insensitive, fuzzy match)
  2. Confirm before executing:
Moving TEAM-42: "API Rate Limit Fix"
  From: In Progress
  To: Done

Proceed? (y/n)
  1. Execute transition:
bash
acli jira --action transitionIssue --issue "KEY-123" --transition "Done"
  1. Update vault — If a vault note has jira_key: KEY-123:
    • If moved to a "shipped" status (per status_mapping): Update note status: resolved or status: shipped
    • If moved to a "blocked" status: Flag in daily note
    • Check if archive_on_status_change applies

edit — Update Issue Fields

Update fields on an existing Jira issue.

Processing

  1. Parse issue key and fields from $ARGUMENTS
    • --summary "new title", --description "new desc", --priority High, --labels "label1,label2"
  2. Confirm before executing:
Updating TEAM-42:
  summary: "New Title"
  priority: High

Proceed? (y/n)
  1. Execute update:
bash
acli jira --action updateIssue --issue "KEY-123" --summary "New Title" --priority "High"

assign — Assign Issue

Assign an issue to a team member.

Processing

  1. Parse issue key and assignee from $ARGUMENTS
    • /jira assign TEAM-42 "john.doe" or /jira assign TEAM-42 me
  2. If me, resolve current user from config
  3. Confirm before executing:
Assigning TEAM-42 to john.doe

Proceed? (y/n)
  1. Execute:
bash
acli jira --action updateIssue --issue "KEY-123" --assignee "john.doe"

backlog — View Backlog

Show backlog items not in the active sprint.

Processing

  1. Resolve project
  2. Fetch backlog issues:
bash
acli jira --action getIssueList --project "PROJECT" --filter "sprint not in openSprints()" --outputType json
  1. Present sorted by priority:
## Backlog — {PROJECT} ({count} items)

### High Priority
- [{KEY}] {summary} — {type} ({assignee})

### Medium Priority
- [{KEY}] {summary} — {type} ({assignee})

### Low / Unset
- [{KEY}] {summary} — {type}

search — Search Issues

Find issues using JQL or natural language queries.

Processing

  1. Parse query from $ARGUMENTS (everything after "search")

  2. Determine if it's JQL or natural language:

    • Contains JQL operators (=, in, AND, ORDER BY, field names like assignee, status) → Use as JQL
    • Otherwise → Convert natural language to JQL
  3. Natural language → JQL conversion examples:

    • "my open bugs" → assignee = currentUser() AND type = Bug AND status != Done
    • "high priority in TEAM" → project = TEAM AND priority in (Highest, High)
    • "created this week" → created >= startOfWeek()
    • "blocked items" → status = Blocked OR labels = blocked

    When unsure, refer to references/jql-cheatsheet.md for patterns.

  4. Execute search:

bash
acli jira --action getIssueList --jql "YOUR_JQL" --outputType json
  1. Present results:
## Jira Search: "{query}"

Found {count} issues:

| Key | Summary | Status | Assignee | Priority | Updated |
|-----|---------|--------|----------|----------|---------|
| {key} | {summary} | {status} | {assignee} | {priority} | {date} |
  1. Offer follow-up actions: "Want to /jira status KEY for details or /jira move KEY status to transition?"

sprint — Active Sprint

Show the active sprint with progress metrics.

Processing

  1. Resolve project
  2. Fetch active sprint data:
bash
acli jira --action getIssueList --project "PROJECT" --filter "sprint in openSprints()" --outputType json
  1. Present with metrics:
## Active Sprint — {sprint name}

**Dates**: {start} → {end} ({days remaining} days left)
**Progress**: {done}/{total} issues ({percent}%)

### Done ({count})
- [{KEY}] {summary}

### In Progress ({count})
- [{KEY}] {summary} — {assignee}

### To Do ({count})
- [{KEY}] {summary} — {assignee}

### Blocked ({count})
- [{KEY}] {summary} — ⚠ {blocker reason}

sync — Pull Jira State Into Vault

Sync Jira issue state with vault notes. Additive only — creates/updates vault notes, never deletes.

Processing

  1. Create a session task for progress tracking
  2. Resolve project (or sync all mapped projects)
  3. Read integrations.jira.status_mapping and integrations.jira.project_mapping from config
  4. Fetch recent issues (updated in last 7 days, or --days N):
bash
acli jira --action getIssueList --project "PROJECT" --jql "updated >= -7d" --outputType json
  1. For each issue, determine vault action based on status_mapping:

    Blocked issues → Create/update blocker notes:

    • Check if a blocker note with jira_key: KEY already exists
    • If not, create one using _templates/blocker.md:
      • jira_key: KEY-123 in frontmatter
      • tags: [KEY-123]
      • severity mapped from Jira priority
      • ## Links includes [KEY-123](https://site/browse/KEY-123)
    • If exists and still blocked, skip (no-op)
    • If exists but now resolved in Jira, update status: resolved

    Shipped issues → Update daily note:

    • Check today's daily note exists
    • Append shipped items under the relevant project's ### Shipped section
    • Format: - [{KEY}] {summary} ✓

    Resolved blockers → Archive:

    • Find vault blockers with matching jira_key where Jira status maps to "shipped"
    • Update status: resolved (auto-archive rules will handle the rest)
  2. Bulk safety: If sync would create 5+ new notes, show summary and confirm:

Sync will create:
  - 3 new blocker notes
  - 7 shipped items added to daily note
  - 2 blockers resolved

Proceed? (y/n)
  1. Report what was synced:
## Jira Sync Complete — {date}

Created: 3 blocker notes
Updated: 2 blockers → resolved
Daily: 7 shipped items added
Skipped: 12 issues (no vault action needed)

Flags

  • --days N — Look back N days (default: 7)
  • --dry-run — Show what would change without writing
  • --project {name} — Sync only one project

(empty) — Help & Quick Status

When called with no arguments, show help and a quick status summary.

Processing

  1. Check acli connection status
  2. Read Jira config from _core/config.yaml
  3. Count vault notes linked to Jira issues:
bash
grep -rl "^jira_key:" --include="*.md" | wc -l
  1. Present:
## Jira Integration

**Status**: Connected to {site}
**Mapped projects**: {project-a} → TEAM, ...
**Vault links**: {count} notes linked to Jira issues

### Commands

| Command | Example | Purpose |
|---------|---------|---------|
| board | `/jira board TEAM` | View board columns |
| create | `/jira create TEAM --summary "..."` | Create issue |
| status | `/jira status TEAM-42` | Issue details |
| move | `/jira move TEAM-42 Done` | Transition issue |
| edit | `/jira edit TEAM-42 --summary "..."` | Update fields |
| assign | `/jira assign TEAM-42 john` | Assign issue |
| backlog | `/jira backlog TEAM` | View backlog |
| search | `/jira search "my open bugs"` | Search via JQL |
| sprint | `/jira sprint TEAM` | Active sprint |
| sync | `/jira sync` | Pull state into vault |
| setup | `/jira setup` | Configure connection |

Vault Integration Patterns

Frontmatter Tagging

When a vault note is linked to a Jira issue, add to frontmatter:

yaml
jira_key: TEAM-42
tags: [TEAM-42]

Cross-Reference Format

In note body and ## Links sections, use:

markdown
[TEAM-42](https://your-org.atlassian.net/browse/TEAM-42)

Status Mapping

Map Jira statuses to PM-Kit categories via integrations.jira.status_mapping in config:

Jira StatusPM-Kit Category
To Dowip
In Progresswip
Doneshipped
Blockedblocked

Users can customize this mapping for their Jira workflow (e.g., add "In Review" → wip).

Safety Rules

  1. Read-only commands execute without confirmation: board, status, search, sprint, backlog
  2. Mutating commands require confirmation: create, move, edit, assign
  3. Sync is additive only — creates/updates vault notes, never deletes vault content
  4. Bulk operations (5+ changes) show summary before proceeding
  5. API tokens are handled by acli — never log, display, or store tokens in vault files
  6. Never auto-transition Jira issues based on vault changes — Jira writes only happen via explicit commands

Error Handling

ErrorResponse
acli not installedShow install instructions, suggest /jira setup
Not authenticatedShow auth steps, link to API token page
Invalid project keyShow available projects from config mapping
Issue not foundSuggest search, check key format
Transition not availableShow available transitions for the issue
No project mappingAsk user to configure in _core/config.yaml or run /jira setup

Additional Resources

Reference Files

  • references/jql-cheatsheet.md — Common JQL patterns for PMs

Scripts

  • scripts/check-jira.sh — Verify acli installation and auth status

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Jira AI skill do?

Jira integration via acli CLI. Use when user says '/jira', 'check Jira board', 'create Jira ticket', 'move ticket to done', 'search Jira', 'sync blockers from Jira', 'what's in the sprint', 'Jira status', 'assign ticket', 'view backlog', or wants to interact with Jira issues, sprints, or boards from the terminal.

Why use Jira on TypingMind?

Because you install it once and use it with any model. Jira is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Jira in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/kv0906/pm-kit/tree/main/.claude/skills/jira. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Jira?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Jira?

As many as you like. As long as a model supports skills, you can use Jira with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Jira AI skill free?

Yes. It is published on GitHub by kv0906 under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇