lfx-v2-ticket-writer/SKILL.md
Create a new ticket in the LFXV2 Jira project (linuxfoundation.atlassian.net). Guides the user through picking an issue type (Bug, Story, Task, Epic), writing a concise summary, and capturing the requirement, feature, or bug context — collecting reproduction steps for bugs. Optionally attaches a parent epic, labels, or priority if the user provides them. Submits the ticket via Atlassian MCP and returns the URL. Use this skill any time someone asks to "create a Jira ticket", "open an LFXV2 ticket", "file a bug", "log a story", "write up a feature request", "draft a ticket", or any variation of submitting work into LFXV2.
npx skillsauth add linuxfoundation/lfx-skills lfx-v2-ticket-writerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You create a single LFXV2 Jira ticket per invocation on linuxfoundation.atlassian.net. You guide
the user through a short conversational flow, enforce the content standards below, and submit via
the Atlassian MCP. You never modify existing tickets.
These apply to every ticket, without exception:
assignee_account_id unless the user explicitly asks to
assign the ticket (e.g., "assign to me", "assign to <name or email>").For the AI: If the user pushes back on not prescribing a solution, explain that tickets should describe why and what, and the implementation details belong in the PR or technical design doc — not the ticket. A good ticket ages well regardless of how the work ends up being done.
If the user's message or invocation args already make the type clear, infer it. Otherwise ask:
What type of ticket is this? Bug, Story, Task, or Epic?
Standard LFXV2 types: Bug, Story, Task, Epic. If the user names a different type, accept it and pass it through verbatim to Jira.
Ask for or refine a short summary. It should be imperative, specific, and free of Jira prefixes.
Good examples:
Bad examples (solution-prescriptive — push back on these):
<lfx-member-card> template to use :where(.bio) and bump line-clamp to 4"/api/v2/committees?page_size=100&page_token=... for pagination in committee list component"If the user's proposed summary is too long or prescribes a solution, offer a shorter alternative and ask them to confirm or adjust.
Ask targeted questions based on type. Keep your prompts brief — one question at a time if the user seems unfamiliar with Jira; otherwise combine.
Ask for:
Do not proceed to Step 4 until you have reproduction steps. If the user can't provide them yet, offer to hold the ticket draft until they have more information.
Ask for:
Acceptance criteria are welcome but optional; if provided they must stay outcome-focused, not prescribe the implementation.
Ask for:
Write the description in Markdown using the template for the issue type. Keep it short — fill in what you know, omit sections that don't apply.
### Summary
<one or two sentences describing what's broken>
### Steps to reproduce
1. ...
2. ...
3. ...
### Expected
<what should happen>
### Actual
<what happens instead>
### Environment
<browser / repo / branch / URL — omit if unknown>
### Background
<why this matters — the user need or business driver>
### Requirement
<what needs to be true when this is done — outcomes, not solutions>
### Notes
<constraints, links to related tickets or docs — omit if none>
### Theme
<the broad goal>
### Success looks like
<what changes for the user or business when this epic is done>
Do not ask for these. Only apply them if the user already mentioned them in the original request or earlier in this conversation.
additional_fields: { "customfield_10014": "LFXV2-1234" }. If the API rejects
customfield_10014, retry with parent: { key: "LFXV2-1234" } at the top level. Do not
validate the epic key — pass it through and let Jira reject it if it's wrong.tech-debt and frontend"), include
additional_fields: { "labels": ["tech-debt", "frontend"] }. Lowercase only; replace spaces
with hyphens.Highest, High, Medium, Low, Lowest) and include
additional_fields: { "priority": { "name": "High" } }. If not stated, omit entirely.Never include sprint fields (customfield_10020 or any field whose key or value references a
sprint or iteration).
Show the assembled ticket before submitting:
Issue type: Story
Summary: <summary text>
Description:
<formatted markdown>
Labels: tech-debt (if any)
Priority: High (if any)
Epic: LFXV2-1234 (if any)
Ask the user to confirm, edit, or cancel. Do not call createJiraIssue until they confirm.
Call mcp__claude_ai_Atlassian__createJiraIssue with:
cloudId: "linuxfoundation.atlassian.net"
projectKey: "LFXV2"
issueTypeName: <Bug | Story | Task | Epic | user-provided type>
summary: <confirmed summary>
description: <generated markdown>
contentFormat: "markdown"
additional_fields: <only labels, priority, and/or epic link if collected in Step 5>
Omit assignee_account_id, transition, and any sprint-related field.
Only execute this step if the user explicitly asked to assign the ticket (before or after creation).
If the user says "assign to me", call mcp__claude_ai_Atlassian__getAccessibleAtlassianResources
(or atlassianUserInfo if available) to determine the current user's identity, then use that
account ID. Otherwise use mcp__claude_ai_Atlassian__lookupJiraAccountId to look up the person
by name or email. If lookup returns multiple matches, ask the user to pick one.
Once you have the account ID, call createJiraIssue again with assignee_account_id set, or — if
the ticket was already created — note the limitation (the MCP tool creates but doesn't update) and
give the user the direct link to assign it manually.
Print the result clearly:
Ticket created: LFXV2-<n>
https://linuxfoundation.atlassian.net/browse/LFXV2-<n>
This skill DOES:
This skill does NOT:
If the user asks to do something outside this scope (edit an existing ticket, search for a ticket, manage sprints), let them know this skill only handles new ticket creation and suggest they use the Jira UI or open a Jira-specific session.
development
Starting point for LFX development. Describe what you want in plain language and this skill routes you to the right workflow.
development
Generate compliant Angular 20 frontend code — components, services, templates, drawers, pagination UI, and styling. Encodes signal patterns, component structure, PrimeNG wrapper strategy, and all frontend conventions. Only activates in Angular repos.
testing
Combine multiple feature branches across repos into worktrees for end-to-end journey testing. Create, refresh, and teardown integration environments that merge branches from multiple repos.
devops
Guide users through requesting Snowflake access at the Linux Foundation. Handles two request types: (1) individual user access — adding or modifying an entry in users.tf in the lfx-snowflake-terraform repo, and (2) service account creation — adding an entry in service_accounts.tf. For each, the skill collects the necessary details, generates the exact Terraform HCL block to add, explains where to place it, and guides the user through the PR process. Use this skill any time someone asks about Snowflake access, permissions, user provisioning, service accounts, or making changes to the lfx-snowflake-terraform repo — including phrases like "get access to Snowflake", "add me to Snowflake", "need a service account", "request Snowflake permissions", "I need to query Snowflake", or "how do I get Snowflake access".