Initial commit
This commit is contained in:
12
.claude-plugin/plugin.json
Normal file
12
.claude-plugin/plugin.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"name": "jira-ticket",
|
||||
"description": "Generate Jira tickets from discussions, PRs, issues, or files",
|
||||
"version": "1.0.0",
|
||||
"author": {
|
||||
"name": "Claude Code Plugins",
|
||||
"email": "plugins@claude.com"
|
||||
},
|
||||
"commands": [
|
||||
"./commands"
|
||||
]
|
||||
}
|
||||
3
README.md
Normal file
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# jira-ticket
|
||||
|
||||
Generate Jira tickets from discussions, PRs, issues, or files
|
||||
233
commands/jira-ticket.md
Normal file
233
commands/jira-ticket.md
Normal file
@@ -0,0 +1,233 @@
|
||||
---
|
||||
description: Generate Jira tickets from discussions, PRs, issues, or files
|
||||
argument-hint: [reference]
|
||||
---
|
||||
|
||||
# Generate Jira Ticket
|
||||
|
||||
Create a high-level Jira issue from a discussion, PR, issue, file, or conversation.
|
||||
|
||||
**Arguments**: `$ARGUMENTS` (required)
|
||||
- Can be: GitHub URL, PR number, issue number, file path, commit hash/range, or "conversation"
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: Context Discovery & Gathering
|
||||
|
||||
**Goal**: Identify what the argument references and gather relevant context
|
||||
|
||||
**Actions**:
|
||||
1. Create a todo list with all phases:
|
||||
- Phase 1: Context Discovery & Gathering
|
||||
- Phase 2: Generate Jira Issue
|
||||
- Phase 3: Validation & Preview
|
||||
- Phase 4: Save to File
|
||||
|
||||
2. Mark Phase 1 as in_progress
|
||||
|
||||
3. Analyze `$ARGUMENTS` to determine the type:
|
||||
- **If empty or not provided**: Error - ask user to provide a reference
|
||||
- **If GitHub URL (starts with https://github.com/ or http://github.com/)**: Parse and use gh
|
||||
- For PR URLs (e.g., `https://github.com/owner/repo/pull/123`):
|
||||
- Extract owner, repo, and PR number
|
||||
- Use `gh pr view <number> -R owner/repo`
|
||||
- For issue URLs (e.g., `https://github.com/owner/repo/issues/456`):
|
||||
- Extract owner, repo, and issue number
|
||||
- Use `gh issue view <number> -R owner/repo`
|
||||
- **If numeric (e.g., "123")**: Check if it's a PR or issue number in current repo
|
||||
- Try `gh pr view $ARGUMENTS` first
|
||||
- If that fails, try `gh issue view $ARGUMENTS`
|
||||
- **If starts with # (e.g., "#123")**: Treat as issue number in current repo
|
||||
- Use `gh issue view ${ARGUMENTS#\#}`
|
||||
- **If starts with PR# or pr# (e.g., "PR#123")**: Treat as PR number in current repo
|
||||
- Extract number and use `gh pr view <number>`
|
||||
- **If file path exists**: Read the file contents
|
||||
- Use Read tool to read the file
|
||||
- **If git commit hash or range (e.g., "abc123" or "abc123..def456")**: Get commit messages
|
||||
- Use `git log --format="%h %s%n%b" $ARGUMENTS`
|
||||
- **If "conversation" or "chat"**: Use current conversation context
|
||||
- Inform user you'll use the current conversation as context
|
||||
- **Otherwise**: Treat as a search term or ask user to clarify
|
||||
|
||||
4. Gather the context based on the identified type:
|
||||
- For PRs: Extract title, description, and relevant comments
|
||||
- For issues: Extract title, description, and discussion
|
||||
- For files: Read and summarize the content
|
||||
- For commits: Collect commit messages and changes summary
|
||||
- For conversation: Use recent messages in this chat
|
||||
|
||||
5. Present a brief summary of gathered context to confirm with user:
|
||||
```
|
||||
**Context Gathered**:
|
||||
Type: [PR/Issue/File/Commits/Conversation]
|
||||
Source: [specific reference]
|
||||
Summary: [1-2 sentence summary]
|
||||
|
||||
Proceeding to generate Jira issue...
|
||||
```
|
||||
|
||||
6. Mark Phase 1 as completed, Phase 2 as in_progress
|
||||
|
||||
**Error Handling**:
|
||||
- If argument is missing → ask user to provide a reference
|
||||
- If PR/issue not found → ask user to verify the number
|
||||
- If file doesn't exist → ask user to check the path
|
||||
- If git command fails → ask if we're in a git repository
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: Generate Jira Issue
|
||||
|
||||
**Goal**: Create a high-level Jira issue following the template
|
||||
|
||||
**Actions**:
|
||||
1. Using the gathered context, generate a Jira issue that:
|
||||
- Follows the Jira template structure (provided below)
|
||||
- Extracts **high-level context only** - NO implementation details or design steps
|
||||
- Anonymizes any customer names → replace with "customer"
|
||||
- Adds links where possible (PR links, issue links, commit links, file URLs)
|
||||
- Uses Jira markdown formatting
|
||||
- Is copy-paste ready for Jira input box
|
||||
|
||||
2. Generate a recommended title (one line, descriptive, under 100 characters)
|
||||
|
||||
3. Use this Jira template structure:
|
||||
|
||||
```jira-markup
|
||||
h1. Story (Required)
|
||||
|
||||
As a <PERSONA> trying to <ACTION> I want <THIS OUTCOME>
|
||||
|
||||
_<Describes high level purpose and goal for this story. Answers the questions: Who is impacted, what is it and why do we need it? How does it improve the customer's experience?>_
|
||||
|
||||
h2. *Background (Required)*
|
||||
|
||||
_<Describes the context or background related to this story>_
|
||||
|
||||
h2. *Out of scope*
|
||||
|
||||
_<Defines what is not included in this story>_
|
||||
|
||||
h2. *Approach (Required)*
|
||||
|
||||
_<Description of the general technical path on how to achieve the goal of the story. Include details like json schema, class definitions>_
|
||||
|
||||
h2. *Dependencies*
|
||||
|
||||
_<Describes what this story depends on. Dependent Stories and EPICs should be linked to the story.>_
|
||||
|
||||
h2. *Acceptance Criteria (Mandatory)*
|
||||
|
||||
_<Describe edge cases to consider when implementing the story and defining tests>_
|
||||
_<Provides a required and minimum list of acceptance tests for this story. More is expected as the engineer implements this story>_
|
||||
```
|
||||
|
||||
4. **IMPORTANT Guidelines**:
|
||||
- Do NOT add implementation details - keep it high-level for engineers to figure out
|
||||
- Do NOT add low-level design steps
|
||||
- DO add links to relevant resources (PRs, issues, docs, commits)
|
||||
- DO use clear, testable Acceptance Criteria (Given/When/Then or numbered checklist)
|
||||
- DO keep customer references anonymous as "customer"
|
||||
- DO format everything in Jira markdown (h1., h2., *, _, etc.)
|
||||
|
||||
5. Mark Phase 2 as completed, Phase 3 as in_progress
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: Validation & Preview
|
||||
|
||||
**Goal**: Validate the generated issue and get user approval
|
||||
|
||||
**Actions**:
|
||||
1. Validate that all required fields are filled:
|
||||
- Story section has content
|
||||
- Background section has content
|
||||
- Approach section has content
|
||||
- Acceptance Criteria has content
|
||||
|
||||
2. Present the generated Jira issue to the user:
|
||||
```
|
||||
**Recommended Title**:
|
||||
[Generated title]
|
||||
|
||||
**Jira Issue Body**:
|
||||
[Show the full generated Jira issue in a code block]
|
||||
```
|
||||
|
||||
3. **Ask user**: "Does this Jira issue look good? Should I save it to a file?"
|
||||
|
||||
4. **WAIT FOR USER RESPONSE**
|
||||
|
||||
5. If user wants changes:
|
||||
- Ask what needs to be modified
|
||||
- Regenerate the issue
|
||||
- Return to step 2
|
||||
|
||||
6. If user approves:
|
||||
- Mark Phase 3 as completed, Phase 4 as in_progress
|
||||
- Proceed to Phase 4
|
||||
|
||||
7. If user rejects:
|
||||
- Exit gracefully
|
||||
- Mark all remaining phases as completed
|
||||
|
||||
**Error Handling**:
|
||||
- If any required field is missing → warn user and ask if they want to proceed anyway
|
||||
|
||||
---
|
||||
|
||||
## Phase 4: Save to File
|
||||
|
||||
**Goal**: Save the Jira issue to a file with a smart filename
|
||||
|
||||
**Actions**:
|
||||
1. Generate a filename slug from the title:
|
||||
- Convert title to lowercase
|
||||
- Replace spaces with hyphens
|
||||
- Remove special characters
|
||||
- Limit to 50 characters
|
||||
- Add `.md` extension
|
||||
- Example: "Add user authentication flow" → "add-user-authentication-flow.md"
|
||||
|
||||
2. Ask user for save location using AskUserQuestion tool:
|
||||
- Option 1: Save to `/tmp/jira-[slug].md`
|
||||
- Option 2: Save to current directory `./jira-[slug].md`
|
||||
- Show both full paths in the options
|
||||
|
||||
3. Save the file to the chosen location:
|
||||
- Write the Jira issue content to the file
|
||||
- Include a comment at the top with metadata:
|
||||
```
|
||||
<!-- Generated by Claude Code jira-ticket plugin -->
|
||||
<!-- Source: [context source] -->
|
||||
<!-- Date: [current date] -->
|
||||
```
|
||||
|
||||
4. Report success to user:
|
||||
```
|
||||
✓ Jira issue saved successfully!
|
||||
|
||||
**File**: [full path to saved file]
|
||||
**Title**: [recommended title]
|
||||
|
||||
**Next Steps**:
|
||||
1. Review the file: `cat [path]`
|
||||
2. Copy to clipboard: `cat [path] | pbcopy` (macOS) or `cat [path] | xclip -selection clipboard` (Linux)
|
||||
3. Paste into Jira and use the recommended title above
|
||||
```
|
||||
|
||||
5. Mark Phase 4 as completed
|
||||
|
||||
**Error Handling**:
|
||||
- If file write fails → report error and suggest alternative location
|
||||
- If directory doesn't exist → create it or ask user for alternative
|
||||
|
||||
---
|
||||
|
||||
## Final Notes
|
||||
|
||||
- The plugin uses TodoWrite to track progress through all phases
|
||||
- Each phase has clear boundaries and completion markers
|
||||
- User approval is required before saving
|
||||
- Smart context gathering handles multiple input types
|
||||
- Output is Jira-ready markdown with proper formatting
|
||||
45
plugin.lock.json
Normal file
45
plugin.lock.json
Normal file
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"$schema": "internal://schemas/plugin.lock.v1.json",
|
||||
"pluginId": "gh:chmouel/claude-code-plugins:plugins/jira-ticket",
|
||||
"normalized": {
|
||||
"repo": null,
|
||||
"ref": "refs/tags/v20251128.0",
|
||||
"commit": "de601c8d4d4d97323e11673625e6065436c65d07",
|
||||
"treeHash": "3bf4fbe4ddd17eb1e5c27dab2018ab147450ce091ee699e15512962798f713d2",
|
||||
"generatedAt": "2025-11-28T10:15:02.635544Z",
|
||||
"toolVersion": "publish_plugins.py@0.2.0"
|
||||
},
|
||||
"origin": {
|
||||
"remote": "git@github.com:zhongweili/42plugin-data.git",
|
||||
"branch": "master",
|
||||
"commit": "aa1497ed0949fd50e99e70d6324a29c5b34f9390",
|
||||
"repoRoot": "/Users/zhongweili/projects/openmind/42plugin-data"
|
||||
},
|
||||
"manifest": {
|
||||
"name": "jira-ticket",
|
||||
"description": "Generate Jira tickets from discussions, PRs, issues, or files",
|
||||
"version": "1.0.0"
|
||||
},
|
||||
"content": {
|
||||
"files": [
|
||||
{
|
||||
"path": "README.md",
|
||||
"sha256": "0e3eb71feefbe1e162d81fa9ab684271556c35d4f10403c9b598a5a20e7c04b8"
|
||||
},
|
||||
{
|
||||
"path": ".claude-plugin/plugin.json",
|
||||
"sha256": "e50f0c548e220a3359edae7e9b66b0fc1710142f9e044c27b91438b923328f15"
|
||||
},
|
||||
{
|
||||
"path": "commands/jira-ticket.md",
|
||||
"sha256": "3d35165be0351ad2ed7c89277d310c252d7dac00e75c1acbb36dcaf2397e77cf"
|
||||
}
|
||||
],
|
||||
"dirSha256": "3bf4fbe4ddd17eb1e5c27dab2018ab147450ce091ee699e15512962798f713d2"
|
||||
},
|
||||
"security": {
|
||||
"scannedAt": null,
|
||||
"scannerVersion": null,
|
||||
"flags": []
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user